1. 程式人生 > 其它 >今日學習——藍橋杯 2019年 C語言 B組

今日學習——藍橋杯 2019年 C語言 B組

1、手淦(親身體驗,,,沒啥大用,最終還是程式碼)

2、程式碼(下面是我看其他博主程式碼答案能看的懂的。。。。具體的可以直接去下面的網址看)

https://blog.csdn.net/qq_44524918/article/details/113530469?spm=1001.2014.3001.5506

1)試題B:年號字串

【問題描述】
小明用字母A對應數字1,B對應2,以此類推,用Z對應26。對於27以上的數字,小明用兩位或更長位的字串來對應,例如AA對應27,AB對應28,AZ對應52,LQ對應329。
請問2019對應的字串是什麼?

【答案提交】
這是一道結果填空的題,你只需要算出結果後提交即可。本題的結果為一個大寫英文字串,在提交答案時只填寫這個字串,注意全部大寫,填寫多餘的內容將無法得分。

題解
答案:BYQ
這道題目實際就是一個將十進位制轉換為26進位制

#include <iostream>
using namespace std;

char str[27] = {0,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};

int main(){
    int n;
    string ans;
    cin >> n;
    
    while(n){
        ans += str[n % 26
]; n /= 26; } int len = ans.length(); for(int i=len-1; i>=0; i--) cout << ans[i]; return 0; }

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

【答案提交】
這是一道結果填空的題,你只需要算出結果後提交即可。本題的結果為一個 4 位整數(提示:答案的千位不為 0),在提交答案時只填寫這個整數,填寫多餘的內容將無法得分。

題解
答案:4659
本題類似斐波那契數列,但最後的數值可能會很大,所以我們需要在每一步都餘10000,且每步餘並不會改變其最後結果,如:

#include <iostream>
using namespace std;

const int mod = 1e4;
long long f[20190327]; 

int main(){
    f[1] = f[2] = f[3] = 1;
    
    for(int i=4; i<=20190324; i++){
        f[i] = (f[i-1] + f[i-2] + f[i-3]) % mod;
    }
    
    cout << f[20190324] << endl;;
    return 0;
}

試題 D: 數的分解
【問題描述】
把 2019 分解成 3 個各不相同的正整數之和,並且要求每個正整數都不包含數字 2 和 4,一共有多少種不同的分解方法?注意交換 3 個整數的順序被視為同一種方法,例如 1000+1001+18 和1001+1000+18 被視為同一種。

【答案提交】
這是一道結果填空的題,你只需要算出結果後提交即可。本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多餘的內容將無法得分。

題解
答案:40785

#include <iostream>
using namespace std;

bool check(int num)
{
    while (num)
    {
        if (num%10==2||num%10==4)
            return true;
        num/=10;
    }
    return false;
}
int main() {
    int res = 0;
    
    for (int i = 1; i < 2019 ; ++i) {
        if (check(i)) continue;
        for (int j = i+1; j < 2019 ; ++j) {
            if (check(j)) continue;
            for (int k = j+1; k < 2019 ; ++k) {
                if (check(k)) continue;
                if (i+j+k==2019)
                    res++;
            }
        }
    }
    cout << res << endl;
    return 0;
}

試題 H: 等差數列
時間限制: 1.0s 記憶體限制: 256.0MB 本題總分:20 分

【問題描述】
數學老師給小明出了一道等差數列求和的題目。但是粗心的小明忘記了一部分的數列,只記得其中 N 個整數。
現在給出這 N 個整數,小明想知道包含這 N 個整數的最短的等差數列有
幾項?

【輸入格式】
輸入的第一行包含一個整數 N。
第二行包含 N 個整數 A1, A2, · · · , AN。(注意 A1 ∼ AN 並不一定是按等差數列中的順序給出)

【輸出格式】
輸出一個整數表示答案。

【樣例輸入】
5
2 6 4 10 20
【樣例輸出】

10
【樣例說明】
包含 2、6、4、10、20 的最短的等差數列是 2、4、6、8、10、12、14、16、18、20。

【評測用例規模與約定】
對於所有評測用例,2 ≤ N ≤ 100000,0 ≤ Ai ≤ 109。

#include <iostream>
#include <algorithm>
#include <set>
using namespace std;

const int max_n = 100005;
int a[max_n], N, res = 0;

int main(){
    cin >> N;
    set<int> d;
    
    for(int i=0; i<N; i++)
        cin >> a[i];
    
    sort(a, a+N); //將已知的數列從小到大排序
    
    for(int i=1; i<N; i++)//找出最小公差,set 可以自動排序,且元素唯一 
        d.insert(a[i] - a[i-1]);
    int t = *(d.begin());//d 的首元素即最小公差

    for(int i=a[0]; i<a[N-1]; i=i+t) res++; //算出最小項
    
    cout << res+1;
    return 0;
}