天津大學智能學部 2020 推免機試真題

天津大學智能學部 2020 推免機試真題

寫在前面,本人非計科軟工-編程小小白一枚,原以爲機試題目和夏令營機試題目差不多,就沒準備很多。現在真的打臉了… 爲了給以後推免的同學有個心裏準備,現將機試所見所聞總結如下。

機試要求

  • 只能用 C/C++,codeblocks,dev 都可以。
  • 不能用萬能頭文件,不支持 C++11,應該是 98 的,時間 1h 30min。
  • {\color{Red}{四道題}},題目難度分佈不定。
  • 前兩題短一點,後兩題長一點,英文,還要動點腦子理解。

好吧,小白的我就看了兩道題,AC一道,還一道沒調好。
後面兩大題想騙分的,結果沒騙到 0.0

第一題

不折騰英文了,剛開始我都沒看懂題目
大意是,給定一個字符串,請在它所有的子字符串中找出符合以下條件的子字符串的個數:子字符串中的每個字符數目不超過 NN
部分範圍不記得了。

  • 輸入格式:

    • 第一行 T(1T1000)T(1\le T \le 1000),表示要判斷的組數。
    • N(1N100)N(1\le N \le 100),表示子串中字符不能超過的數目。
    • S(1S10000)S(1\le S \le 10000),表示輸入的字符串。
  • 輸出格式:

    • MM,表示符合條件的個數。
  • 輸入樣例:

    • 3
    • 1
    • abc
    • 1
    • abcabc
    • 2
    • abcabc
  • 輸出樣例:

    • 6
    • 15
    • 21
  • 我的解法,當時沒調好 -。-

  • (對了,下面用我電腦C++11寫的,朋友要稍微修改一下到98)

#include <iostream>
#include <string>
#include <map>
#include <set>
using namespace std;
// 判斷字串是否符合規則
bool judge(string subs, int n){
    // 假設這個字符串符合規則
    int flag = 1;
    // 字串中所有不同的字符插入集合ss中
    set<char> ss;
    for(int i = 0; i < subs.length(); i++){
        ss.insert(subs[i]);
    }
    // 利用映射查看每個ss中的字符在原字符串中出現的次數
    map<char,int> mapp;
    for(auto i = ss.begin(); i != ss.end(); i++){
        for(int j = 0; j < subs.length(); j++){
            if(*i == subs[j]){
                mapp[*i]++;
                int sma = mapp[*i];
                if(sma > n){
                    flag = 0;
                }
                if(!flag)break;
            }
            if(!flag)break;
        }
    }
    return flag;
}
// 遍歷所有字串
int substr_num(string s, int n){
    int sum = 0;
    for(int i = 1; i <= s.length(); i++){
        for(int j = 0; j <= s.length() - i; j++){
            if(judge(s.substr(j,i),n)){
                sum++;
            }
        }
    }
    return sum;
}
// main function
int main() {
    ios::sync_with_stdio(false);
    int T;
    cin >> T;
    while(T--){
        int num;
        string tmp;
        cin >> num >> tmp;
        cout << substr_num(tmp, num) << endl;
    }
    return 0;
}

第二題

大致題意:
$ F[x] $ 滿足 x 的所有位數相加,即:
F[123]=1+2+3=6,F[4]=4F[123] = 1+2+3 = 6, F[4] = 4
現在要在不大於 NN 的正整數 xx 中找出符合 F[x]F[x] 爲素數的數字的個數。

  • 輸入格式:

    • 第一行 T(1T1000)T(1\le T \le 1000),表示要判斷的組數。
    • N(1N1000)N(1\le N \le 1000),表示要求中的數。
  • 輸出格式:

    • MM,表示符合條件的數字的個數。
  • 輸入樣例:

    • 3
    • 10
    • 2
    • 4
  • 輸出樣例:

    • 4
    • 1
    • 2
#include <iostream>
using namespace std;
// main function
int main() {
    ios::sync_with_stdio(false);
    // 優化的預處理-埃氏篩素數
    int is_prime[1002] = {0};
    for(int i = 2; i < 1002; i++){
        is_prime[i] = 1; // 爲素數
    }
    for(int i = 2; i*i < 1002; i++){
        if(is_prime[i]){
            for(int j = i*i; j < 1002; j += i){
                is_prime[j] = 0; // 非素數
            }
        }
    }
    // 寫好 F[x] 的值存好
    int F[1002] = {0};
    for(int i = 1; i < 1002; i++){
        int sum = 0;
        int gewei = 0;
        int shiwei = 0;
        int baiwei = 0;
        int qianwei = 0;
        if(i >=1 && i <=9){
            gewei = i%10;
        }
        if(i >=10 && i <=99){
            gewei = i%10;
            shiwei = i/10%10;
        }
        if(i >=100 && i <=999){
            gewei = i%10;
            shiwei = i/10%10;
            baiwei = i/100%10;
        }
        if(i >=1000 && i <=9999){
            gewei = i%10;
            shiwei = i/10%10;
            baiwei = i/100%10;
            qianwei = i/1000%10;
        }
        sum = gewei + shiwei + baiwei + qianwei;
        F[i] = sum;
    }
    int T;
    cin >> T;
    while(T--){
        int num;
        int sum = 0; // 符合條件數字的個數
        cin >> num;
        for(int i = 1; i <= num; i++){
            if(is_prime[F[i]]){
                sum++;
            }
        }
        cout << sum << endl;
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章