2019年第十屆藍橋杯大賽軟件類省賽C/C++大學B組


試題 A:組隊

本題總分:5分
【問題描述】
作為籃球隊教練,你需要從以下名單中選出 1號位至 5號位各一名球員,
組成球隊的首發陣容。
每位球員擔任 1號位至 5號位時的評分如下表所示。請你計算首發陣容 1
號位至5號位的評分之和最大可能是多少?

答案:490(該題需考慮清楚,一個人不能擔任兩個位置,98+99+98+97+98=490)

 

 

試題 B:年號字串
本題總分:5分
【問題描述】
小明用字母 A對應數字 1,B對應 2,以此類推,用 Z對應 26。對於 27
以上的數字,小明用兩位或更長位的字符串來對應,例如 AA對應27,AB對
應28,AZ對應52,LQ對應329。
請問2019對應的字符串是什么?
答案:BYQ
(該題我做的時候是直接算了2019/26=77,AZ是52,所以BY對應77,2019%26=17,Q為17,所以答案為BYQ)
但該題考查的是26進制,代碼如下
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
    int x = 2019;
    while(x){
        printf("%c", char(x%26+64));
        x/=26;
    }
    return 0;
}
//結果取反

 

試題c:數列求值

本題總分:10分
【問題描述】
給定數列1,1,1,3,5,9,17,…,從第4項開始,每項都是前3項的和。求
第20190324項的最后4位數字

答案:4659

#include<iostream>
#include<cstdio>
using namespace std;
int main(){
    int a, b, c, d;
    a = b = c = 1;//前三項 
    for(int i = 4; i <= 20190324; i++){
        d = (a+b+c)%10000;//控制后四位數 
        a = b;
        b = c;
        c = d;
    }
    printf("%d\n", d);
    return 0;
}
試題 D:數的分解
本題總分:10分
【問題描述】
把 2019分解成 3個各不相同的正整數之和,並且要求每個正整數都不包
含數字2和4,一共有多少種不同的分解方法?
注意交換 3個整數的順序被視為同一種方法,例如 1000+1001+18和
1001+1000+18被視為同一種。
 
#include<cstdio>
#include<algorithm> 
#include<iostream>
using namespace std;
bool check(int x)    //判斷是否有2,4 
{
    while(x)
    {
        if(x%10==2||x%10==4)
           return true;    
        x/=10;
    }
    return false;
}
int main()
{
    int cnt=0;
    for(int i=1;i<=2019;i++)
    {
        if(check(i)) continue;
        for(int j=i+1;j<=2019;j++)
        {
            if(check(j)) continue;
            int k=2019-i-j;
            if(k<=i||k<=j||check(k))continue;
            cnt+=1;
        }
     } 
     cout<<cnt<<endl;
     return 0;
} 

其中i,j,k分別為三個整數,逐個模擬,邊模擬邊判斷是否有數字2和4;

 

 

試題 F: 特別數的和
時間限制: 1.0s 內存限制: 256.0MB 本題總分:15 分
【問題描述】
小明對數位中含有 2、0、1、9 的數字很感興趣 (不包括前導 0)  ,在 1 到
40 中這樣的數包括 1、2、9、10 至 32、39 和 40,共 28 個,他們的和是 574。
請問,在 1 到 n 中,所有這樣的數的和是多少?
【輸入格式】
輸入一行包含兩個整數 n。
【輸出格式】
輸出一行,包含一個整數,表示滿足條件的數的和。
【樣例輸入】
40
【樣例輸出】
574
【評測用例規模與約定】
對於 20% 的評測用例,1 ≤ n ≤ 10。
對於 50% 的評測用例,1 ≤ n ≤ 100。
對於 80% 的評測用例,1 ≤ n ≤ 1000。
對於所有評測用例,1 ≤ n ≤ 10000。
 
#include<cstdio>
#include<algorithm> 
#include<iostream>
using namespace std;
int main()
{
    int n,sum=0;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        if(i%10==1||i/10==1||i%10==2||i/10==2||i%10==9||i/10==9||i%10==0)
          sum+=i;
    }
    cout<<sum<<endl;
}

 


試題 H: 等差數列
時間限制: 1.0s 內存限制: 256.0MB 本題總分:20 分
【問題描述】
數學老師給小明出了一道等差數列求和的題目。但是粗心的小明忘記了一
部分的數列,只記得其中 N 個整數。
現在給出這 N 個整數,小明想知道包含這 N 個整數的最短的等差數列有
幾項?
【輸入格式】
輸入的第一行包含一個整數 N。
第二行包含 N 個整數 A 1 ,A 2 ,··· ,A N 。(注意 A 1 ∼ A N 並不一定是按等差數
列中的順序給出)
【輸出格式】
輸出一個整數表示答案。
【樣例輸入】
5
2 6 4 10 20
【樣例輸出】
10
【樣例說明】
包含 2、6、4、10、20 的最短的等差數列是 2、4、6、8、10、12、14、16、
18、20。
 
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1e5+10;
int w[maxn];
int ans[maxn];
int main(){
    int n;
    scanf("%d", &n);
    for(int i = 1; i <= n; i++){
        scanf("%d", &w[i]);
    }
    if(w[1]==w[2])   //常數列的情況 
    {
        printf("%d", n);
        return 0;
    }
    sort(w+1, w+n+1);//先排序,從小到大 
    for(int i = 1; i < n; i++){
        ans[i] = w[i+1]-w[i];     //依次算出兩數之差 
    }
    int G = ans[1];
    for(int i = 2; i <= n-1; i++){
        G = gcd(G, ans[i]);
    }
    printf("%d\n", (w[n]-w[1])/G+1);
    return 0;
} 

emmmmm。。。。。。就先寫這幾道題吧,畢竟還是小菜一只,等我弄懂其他的再補吧。

總之這次比賽很粗心,水題都沒做對更別說其他的了,不過我會努力的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM