1. 程式人生 > 實用技巧 >C/C++第十一屆藍橋杯省賽B組第二場比賽

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%\n",(int)(b*100+0.5));
    printf("%d%\n",(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\n",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\n",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; 
}