天津大学智能学部 2020 推免机试真题

天津大学智能学部 2020 推免机试真题

写在前面,本人非计科软工-编程小小白一枚,原以为机试题目和夏令营机试题目差不多,就没准备很多。现在真的打脸了… 为了给以后推免的同学有个心里准备,现将机试所见所闻总结如下。

机试要求

  • 只能用 C/C++,codeblocks,dev 都可以。
  • 不能用万能头文件,不支持 C++11,应该是 98 的,时间 1h 30min。
  • 四 道 题 {\color{Red}{四道题}} ,题目难度分布不定。
  • 前两题短一点,后两题长一点,英文,还要动点脑子理解。

好吧,小白的我就看了两道题,AC一道,还一道没调好。
后面两大题想骗分的,结果没骗到 0.0

第一题

不折腾英文了,刚开始我都没看懂题目
大意是,给定一个字符串,请在它所有的子字符串中找出符合以下条件的子字符串的个数:子字符串中的每个字符数目不超过 N N N
部分范围不记得了。

  • 输入格式:

    • 第一行 T ( 1 ≤ T ≤ 1000 ) T(1\le T \le 1000) T(1T1000),表示要判断的组数。
    • N ( 1 ≤ N ≤ 100 ) N(1\le N \le 100) N(1N100),表示子串中字符不能超过的数目。
    • S ( 1 ≤ S ≤ 10000 ) S(1\le S \le 10000) S(1S10000),表示输入的字符串。
  • 输出格式:

    • M M M,表示符合条件的个数。
  • 输入样例:

    • 3
    • 1
    • abc
    • 1
    • abcabc
    • 2
    • abcabc
  • 输出样例:

    • 6
    • 15
    • 21
  • 我的解法,当时没调好 -。-

  • (对了,下面用我电脑C++11写的,朋友要稍微修改一下到98)

#include 
#include 
#include 
#include 
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 ] = 4 F[123] = 1+2+3 = 6, F[4] = 4 F[123]=1+2+3=6,F[4]=4
现在要在不大于 N N N 的正整数 x x x 中找出符合 F [ x ] F[x] F[x] 为素数的数字的个数。

  • 输入格式:

    • 第一行 T ( 1 ≤ T ≤ 1000 ) T(1\le T \le 1000) T(1T1000),表示要判断的组数。
    • N ( 1 ≤ N ≤ 1000 ) N(1\le N \le 1000) N(1N1000),表示要求中的数。
  • 输出格式:

    • M M M,表示符合条件的数字的个数。
  • 输入样例:

    • 3
    • 10
    • 2
    • 4
  • 输出样例:

    • 4
    • 1
    • 2
#include 
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;
}

你可能感兴趣的:(为预推免)