蓝桥杯刷题准备

第一题:门牌制作

题目描述:

小蓝要为一条街的住户制作门牌号。这条街一共有2020位住户,门牌号从1到2020编号。小蓝制作门牌的方法是先制作0到9这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌1017需要依次粘贴字符1、0、1、7,即需要1个字符0,2个字符1,1个字符7。请问要制作所有的1到2020号门牌,总共需要多少个字符2?

题目分析:

该题为填空题,直接暴力求解。

#include
#include
#include
int count(int x)
{
    int num=0;
    while(x)
    {
        if(x%10==2)
            num++;
        x=x/10;
    }
    return num;
}
int main()
{
    int sum=0;
    for(int i=1;i<=2020;i++)
        sum+=count(i);
    printf("%d",sum);
    return 0;
}

答案:

624

第二题:既约分数

题目描述
如果一个分数的分子和分母的最大公约数是1,这个分数称为既约分数。例如,3/4,5/2,1/8,7/1都是既约分数。请问,有多少个既约分数,分子和分母都是1到2020之间的整数(包括1和2020)
题目分析
由于是填空题,我选择的依然是傻瓜式做法,直接遍历。

#include
#include
#include
int maxgcd(int x,int y)
{
    int t=x>y?y:x;
    for(int i=t;i>=1;i--)
    {
        if(x%i==0&&y%i==0)
            return i;
    }
}
int main()
{
    int ans=0;
    for(int i=1;i<=2020;i++)
    {
        for(int j=1;j<=2020;j++)
        {
            if(maxgcd(i,j)==1)ans+=maxgcd(i,j);
        }
    }
    printf("%d",ans);
    return 0;
}

答案:

2481215

第三题:蛇形填数

题目描述


如下图所示,小明用从1开始的正整数“蛇形”填充无限大的矩阵。容易看出矩阵第二行第二列中的数是5。请你计算矩阵中第20行第20列的数是多少?

1 2 6 7 15 …
3 5 8 14 …
4 9 13 …
10 12 …
11 …


题目分析


可以将图形顺时针旋转45度,我们可以发现20行20列应该位于第39行的中间一个,然后模拟就可以算出来了

1行1列           1
                3 2
2行2列         4 5 6
             10 9 8 7
3行3列     11 12 13 14 15
.................//一共会有2*n-1行,行号等于该行数字个数,每行最大的数为第一行到该行的行号和
#include
#include
#include
int main()
{
    int endmax=(1+39)*39/2;
    int endmin=endmax-39+1;
    printf("%d",(endmax+endmin)/2);

    return 0;
}

答案:

761

第四题:跑步锻炼


题目描述

小蓝每天都锻炼身体。正常情况下,小蓝每天跑1千米。如果某天是周一或者月初(1日),为了激励自己,小蓝要跑2千米。如果同时是周一或月初,小蓝也是跑2千米。小蓝跑步已经坚持了很长时间,从2000年1月1日周六(含)到2020年10月1日周四(含)。请问这段时间小蓝总共跑步多少千米?

题目分析

首先算出总的天数,和月份数,然后求出一共有多少个周一,和周一中为月份的天数
最后总天数+周一天数+月初天数 - 周一和月初重合天数。当然也可以暴力求解。

#include
#include
#include
int mounth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
    int sum=0,Monday=0,monfristday=0,recount=0;
    for(int i=2000;i<=2020;i++)
    {
        if((i%4==0&&i%100!=0)||i%400==0)mounth[2]=29;
        else mounth[2]=28;//这里有必要加个else
        for(int j=1;j<=12;j++)
        {
            if(i==2020&&j==10)break;
            sum+=mounth[j];
            if((sum+1)%7==3)recount++;//即是初一又是周一
            monfristday++;
        }
    }
    monfristday++;//10月1号也要算进来
    Monday+=(sum+1)/7;
    if((sum+1)%7>=3)Monday++;
    printf("%d",sum+1+Monday+monfristday-recount);//sum需要加1,10月1号也要算进来
    return 0;
}

答案:

8879

第五题:七段码

题目描述

小蓝要用七段码数码管来表示一种特殊的文字。

在这里插入图片描述
上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二极管,分别标记为 a, b, c, d, e, f, g。 

小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符的表达时,要求所有发光的二极管是连成一片的。

例如:b 发光,其他二极管不发光可以用来表达一种字符。

例如:c 发光,其他二极管不发光可以用来表达一种字符。

这种方案与上一行的方案可以用来表示不同的字符,尽管看上去比较相似。

例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。

例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光的二极管没有连成一片。

请问,小蓝可以用七段码数码管表达多少种不同的字符?

题目分析

  1. 用 1 ~ 7 来代表 a ~ g
  2. 若某两个二极管相邻,那么就在它们之间连一条边;
  3. 先用 dfs 枚举出二极管的所有亮灭情况;
  4. 再用 并查集 判断是否只有一个连通块;
#include
#include
int light[10],e[10][10],fa[10];
int find(int x)
{
    if(fa[x]==x)return x;
    fa[x]=find(fa[x]);
    return fa[x];
}
void unionn(int x,int y)
{
    int dx=find(x),dy=find(y);
    if(dx==dy)return;
    else fa[dx]=dy;
}
int ans;
void dfs(int x)
{
    if(x>7)
    {
        for(int i=1; i<=7; i++)fa[i]=i;
        for(int i=1; i<=7; i++)
            for(int j=1; j<=7; j++)
            {
                if(light[i]&&e[i][j]&&light[j])
                {
                    unionn(i,j);
                }
            }
        int k=0;
        for(int i=1; i<=7; i++)
        if(light[i]&&fa[i]==i)
            k++;
        if(k==1)ans++;
        return;
    }
    light[x]=1;
    dfs(x+1);
    light[x]=0;
    dfs(x+1);
}
int main()
{
    e[1][2] = e[1][6] = 1;
    e[2][1] = e[2][7] = e[2][3] = 1;
    e[3][2] = e[3][7] = e[3][4] = 1;
    e[4][3] = e[4][5] = 1;
    e[5][4] = e[5][7] = e[5][6] = 1;
    e[6][1] = e[6][7] = e[6][5] = 1;
    e[7][2] = e[7][3] = e[7][5] = e[7][6] = 1;
    dfs(1);
    printf("%d",ans);
    return 0;
}

答案:

80

你可能感兴趣的:(蓝桥,蓝桥杯)