• C/C++第十一届蓝桥杯省赛B组第二场比赛


    A.

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

    暴力查找,答案 624

    B.

    /*如果一个分数的分子和分母的最大公约数是1,这个分数称为既约分数。
    例如,3
    4 , 5
    2 , 1
    8 , 7
    1
    都是既约分数。
    请问,有多少个既约分数,分子和分母都是1 到2020 之间的整数(包括1
    和2020)
    */辗转相除,gcd,答案2481215

    C.

    /*如下图所示,小明用从1 开始的正整数“蛇形”填充无限大的矩阵。
    1 2 6 7 15 :::
    3 5 8 14 :::
    4 9 13 :::
    10 12 :::
    11 :::
    :::
    (1)
    容易看出矩阵第二行第二列中的数是5。请你计算矩阵中第20 行第20 列
    的数是多少?*/

    答案:761,手算。。

    D.

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

    答案:模拟即可,8879

    E.

    /*
    小蓝要用七段码数码管来表示一种特殊的文字。
    上图给出了七段码数码管的一个图示,数码管中一共有7 段可以发光的二
    极管,分别标记为a, b, c, d, e, f, g。
    小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符
    的表达时,要求所有发光的二极管是连成一片的。
    例如:b 发光,其他二极管不发光可以用来表达一种字符。
    例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上
    一行的方案可以用来表示不同的字符,尽管看上去比较相似。
    例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。
    例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光
    的二极管没有连成一片。
    请问,小蓝可以用七段码数码管表达多少种不同的字符?
    */

    答案:深搜,80

    F.

    /**小蓝给学生们组织了一场考试,卷面总分为100 分,每个学生的得分都是
    一个0 到100 的整数。
    如果得分至少是60 分,则称为及格。如果得分至少为85 分,则称为优秀。
    请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整
    数。
    【输入格式】
    输入的第一行包含一个整数n,表示考试人数。
    接下来n 行,每行包含一个0 至100 的整数,表示一个学生的得分。
    【输出格式】
    输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分
    四舍五入保留整数。
    【样例输入】
    7
    80
    92
    56
    74
    88
    100
    0
    【样例输出】
    71%
    43%
    【评测用例规模与约定】
    对于50% 的评测用例,1  n  100。
    对于所有评测用例,1  n  10000。
    试*/

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int main()
    {
        int n,t;
        float a,b;
        float A=0,B=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&t);
            if(t>=85)
            {
                B++;
                A++;
            }
            else if(t>=60)
                B++;
        }
        a=A/n;
        b=B/n;
        printf("%d%
    ",(int)(b*100+0.5));
        printf("%d%
    ",(int)(a*100+0.5));
        return 0; 
    }

    注意四舍五入即可

    G./*2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年2 月2
    日。因为如果将这个日期按“yyyymmdd” 的格式写成一个8 位数是20200202,
    恰好是一个回文数。我们称这样的日期是回文日期。
    有人表示20200202 是“千年一遇” 的特殊日子。对此小明很不认同,因为
    不到2 年之后就是下一个回文日期:20211202 即2021 年12 月2 日。
    也有人表示20200202 并不仅仅是一个回文日期,还是一个ABABBABA
    型的回文日期。对此小明也不认同,因为大约100 年后就能遇到下一个
    ABABBABA 型的回文日期:21211212 即2121 年12 月12 日。算不上“千
    年一遇”,顶多算“千年两遇”。
    给定一个8 位数的日期,请你计算该日期之后下一个回文日期和下一个
    ABABBABA 型的回文日期各是哪一天。
    【输入格式】
    输入包含一个八位整数N,表示日期。
    【输出格式】
    输出两行,每行1 个八位数。第一行表示下一个回文日期,第二行表示下
    一个ABABBABA 型的回文日期。
    【样例输入】
    20200202
    【样例输出】
    20211202
    21211212
    【评测用例规模与约定】
    对于所有评测用例,10000101  N  89991231,保证N 是一个合法日期的
    8 位数表示。
    */ 

    //计算回文日期和ABABBABA型日期
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int pd_d(int y,int m)
    {
        switch(m)
        {
        case 1:    case 3:    case 5:    case 7:case 8:case 10:case 12:return 31;break;
        case 2:    
            if((y%4==0&&y%100!=0)||y%400==0)//判断闰年 
                return 29;
            else
                return 28;
            break;
        default:return 30;break;
        }
    }
    bool pd(char a[])
    {
        int y,m,d;//求年月日 
        y=1000*(a[0]-'0')+100*(a[1]-'0')+10*(a[2]-'0')+(a[1]-'0');
        m=10*(a[4]-'0')+(a[5]-'0');
        d=10*(a[6]-'0')+(a[7]-'0');
        if(m<=12&&d<=pd_d(y,m))
            return 1;
        else 
            return 0;
    }
    int main()
    {
        char a[10],r=1;
        gets(a);
        while(a[0]+1<='9')
        {
            a[3]+=1;
            if(a[3]>'9')
            {
                a[3]-=10;
                a[2]++;
                if(a[2]>'9')
                {
                    a[2]-=10;
                    a[1]++;
                    if(a[1]>'9')
                    {
                        a[0]++;
                        a[1]-=10;
                    }
                }
            }
            a[4]=a[3];a[5]=a[2];a[6]=a[1];a[7]=a[0];
            if(pd(a)&&r)//回文 
            {    
                printf("%s
    ",a);
                r=0;
            }
        //    if((a[0]!=a[1])&&(a[0]==a[2]==a[5]==a[7])&&(a[1]==a[3]==a[4]==a[6]))
                //printf("%s
    ",a);
            if(pd(a)&&(a[0]!=a[1])&&((a[0]==a[2])&&(a[2]==a[5])&&(a[5]==a[7]))&&(a[1]==a[3])&&(a[3]==a[4])&&(a[4]==a[6]))
            {
                printf("%s",a);
                break;
            }
        }
        return 0; 
    }

    H.

    /*对于一个字符串S ,我们定义S 的分值f (S ) 为S 中出现的不同的字符个
    数。例如f (”aba”) = 2, f (”abc”) = 3, f (”aaa”) = 1。
    现在给定一个字符串S [0::n .. 1](长度为n),请你计算对于所有S 的非空
    子串S [i:: j](0  i  j < n), f (S [i:: j]) 的和是多少。
    【输入格式】
    输入一行包含一个由小写字母组成的字符串S 。
    【输出格式】
    输出一个整数表示答案。
    【样例输入】
    ababc
    【样例输出】
    28
    【样例说明】
    子串f值
    a 1
    ab 2
    aba 2
    abab 2
    ababc 3
    b 1
    ba 2
    bab 2
    babc 3
    a 1
    ab 2
    abc 3
    b 1
    bc 2
    c 1
    【评测用例规模与约定】
    对于20% 的评测用例,1  n  10;
    对于40% 的评测用例,1  n  100;
    对于50% 的评测用例,1  n  1000;
    对于60% 的评测用例,1  n  10000;
    对于所有评测用例,1  n  100000。

    */

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    int main()
    {
        int n,count=0,sum=0,word;
        bool w[27];
        char a[100010];
        gets(a);
        n=strlen(a);
        for(int i=0;i<n;i++)
        {
            for(int j=i;j<n;j++)
            {
                word=a[j]-'a';
                if(!w[word])
                {
                    count++;
                    w[word]=true;
                }
                sum+=count;
            }
            count=0;
            memset(w,0,sizeof(w));
        }
        printf("%d",sum);
        return 0; 
    }

    J.

    /*
    平面上有N 条直线,其中第i 条直线是y = Ai  x + Bi。
    请计算这些直线将平面分成了几个部分。
    【输入格式】
    第一行包含一个整数N。
    以下N 行,每行包含两个整数Ai; Bi。
    【输出格式】
    一个整数代表答案。
    【样例输入】
    31
    1
    2 2
    3 3
    【样例输出】
    6
    【评测用例规模与约定】
    对于50% 的评测用例,1  N  4, ..10  Ai; Bi  10。
    对于所有评测用例,1  N  1000, ..100000  Ai; Bi  100000。
    */

    讲实话,不太会,骗分去了

    J.

    /*小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。
    在冒泡排序中,每次只能交换相邻的两个元素。
    小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符,
    则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。
    例如,对于字符串lan 排序,只需要1 次交换。对于字符串qiao 排序,
    总共需要4 次交换。
    小蓝的幸运数字是V,他想找到一个只包含小写英文字母的字符串,对这
    个串中的字符进行冒泡排序,正好需要V 次交换。请帮助小蓝找一个这样的字
    符串。如果可能找到多个,请告诉小蓝最短的那个。如果最短的仍然有多个,
    请告诉小蓝字典序最小的那个。请注意字符串中可以包含相同的字符。
    【输入格式】
    输入一行包含一个整数V,为小蓝的幸运数字。
    【输出格式】
    输出一个字符串,为所求的答案。
    【样例输入】
    4
    【样例输出】
    bbaa
    【样例输入】
    100
    【样例输出】
    jihgfeeddccbbaa
    【评测用例规模与约定】
    对于30% 的评测用例,1  V  20。
    对于50% 的评测用例,1  V  100。
    对于所有评测用例,1  V  10000。
    */

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    //2个重复,最坏情况(n-1)(n-2)/2 
    //解决问题:超过26字母后的最优方法 
    int main()
    {
        int w,n,sum=0,num=2,cnt=0,res;
        scanf("%d",&n);
        while(sum<n)
        {
            if(num<=26) 
            {
                sum=num*(num-1)/2;
                num++;
            }
            else
            {
                sum+=25+cnt;
                cnt++;
            }
        }
        num--;
        res=sum-n;
        for(int i=num-res*2;i>0;i--)
        {
            cout<<(char)('a'+num-res-1);
            num--;
        }
        for(int i=res;i>0;i--)
        {
            cout<<(char)('a'+res-1)<<(char)('a'+res-1);
            res--;
        }
        return 0; 
    }
     
  • 相关阅读:
    IOS开发--第四阶段--关联
    1.7 Flask
    1.4 linux 路飞项目
    linux 1.3 nginx 负载均衡和配置文件
    1.2 redis
    1.1 xinnian
    12.30 linux 7
    12.29
    12.29 linux3 mysql和redis
    12.28 linux 第四天 安装python 和虚拟环境
  • 原文地址:https://www.cnblogs.com/pirote-zjy/p/13846641.html
Copyright © 2020-2023  润新知