2019天梯赛决赛

    科技2022-07-12  121

     

    L1-3 敲笨钟 (20分)

    思路:直接根据",","."找到后一个词,判断是不是押"ong",若都押韵,则把后半句的后3个词换成"qiao ben zhong."

    注意点:使用substr(beginIndex, len)时,首先得判断s的长度是不是大于(beginIndex + len),不然会越界

    #include <iostream> #include<cstdio> using namespace std; ​ int main() {    int n;    scanf("%d", &n);    getchar();    while(n--){        string s;        getline(cin, s);        int flag1, flag2;        flag1 = flag2 = 0;        for(int i = 0; i < s.size(); i++){            if(s[i] == ','){                //注意i>=3不然数组会越界                if(i >=3 && s.substr(i - 3, 3) == "ong"){                    flag1 = 1;               }else                    break;           }            if(s[i] == '.'){                //注意i>=3不然数组会越界                if(i >=3 && s.substr(i - 3, 3) == "ong"){                    flag2 = 1;               }           }       }        if(flag1 && flag2){            int cnt = 0;    //空格的个数            for(int i = s.size() - 1; i >= 0; i--){                if(s[i] == ' ')                    cnt++;                if(cnt == 3){//第3个空格,将后面的3个字换成"qiao ben zhong."                    cout<<s.substr(0, i)<<" qiao ben zhong."<<endl;                    break;               }           }       }else{            printf("Skipped\n");       }   }    return 0; }

     

    L1-8 估值一亿的AI核心代码 (20分)

    思路:模拟

    注意点:我这种写法的时候,can you/ could you 和 I /me进行变换应该放在同一个循环里,不然可能变2次,例如can you-> I can ->you can或者can I->can you ->I can

    #include <iostream> #include<cstdio> #include<cstring> #include<string> using namespace std; ​ int main() {    int n;    scanf("%d", &n);    getchar();    for(int i = 1; i <= n; i++)   {        string s;        getline(cin, s);        cout<<s<<endl;        string str = "";        int flag = 1;//行首空格        for(int i = 0; i < s.size(); i++)       {            if(flag && s[i] == ' ')//去行首空格           {           }            else           {                flag = 0;                str = str + s[i];           }       }        s = ""; ​        //处理标点前的空格        for(int i = 0; i < str.size(); i++)       {            if(str[i] == ' ')           {                while(str[i] == ' ')                    i++;                i--;                char c = str[i+1];                if(ispunct(c))                    i++;           }            s = s + str[i];       }        //cout<<s<<endl;        int cnt = 0; ​        //处理行尾的空格        for(int i = s.size() - 1; i >= 0; i--)       {            if(s[i] == ' ')                cnt++;            else                break;       }        s = s.substr(0, s.size() - cnt);        //cout<<s<<endl; ​        //把原文中所有大写英文字母变成小写,除了 I        for(int i = 0; i < s.size(); i++)       {            if(s[i] >= 'A' && s[i] <= 'Z' && s[i] != 'I')                s[i] = s[i] + 'a' - 'A';       } //       cout<<s<<endl;        str = "";        //把原文中所有独立的 can you、could you 对应地换成 I can、I could        //必须放在一个循环里面,否则可能can you-> I can ->you can或者can I->can you ->I can        for(int i = 0; i < s.size(); i++)       {            if((i == 0 || s[i-1] == ' '|| ispunct(s[i-1])) && s.substr(i,7) == "can you" && ( i + 7 == s.size()|| s[i + 7] == ' '|| ispunct(s[i+7])))           {                str = str + "I can";                i += 6;           }            else if((i == 0 || s[i-1] == ' '|| ispunct(s[i-1])) && s.substr(i,9) == "could you" && ( i + 9 == s.size()|| s[i + 9] == ' '|| ispunct(s[i+9])))           {                i += 8;                str = str + "I could";           }            else if(s[i] == '?')                str = str + "!";            else if((i == 0 || s[i-1] == ' '|| ispunct(s[i-1])) && s[i] == 'I' && ( i + 1 == s.size()|| s[i + 1] == ' ' || ispunct(s[i+1])))                str = str + "you";            else if((i == 0 || s[i-1] == ' ' || ispunct(s[i-1])) && s.substr(i,2) == "me" && ( i + 2 == s.size()|| s[i + 2] == ' '|| ispunct(s[i+2])))           {                i++;                str = str + "you";           }            else                str = str + s[i]; ​       }        cout<<"AI: "<<str<<endl; ​   } ​    return 0; }

    L2-1 特立独行的幸福 (25分)

    思路:先筛出区间中依附于其他数字的幸福数,然后对不是依附于其他数字的幸福数计算出独立性即可,注意素数需要加倍

    #include <iostream> #include<cstdio> #include<algorithm> #include<map> using namespace std; ​ const int maxn = 2e4 + 10; int isOk[maxn]; int vis[maxn];//1表示依附于别的数的幸福数 ​ int fun(int x) {    int cnt = 0;    while( cnt < 100){//循环超过100次基本可以认为死循环        int res = 0;        while(x > 0){//计算平方数            res += (x % 10) * (x % 10);            vis[res] = 1;            x /= 10;       }        x = res;        cnt++;        if(x == 1)break;   }    if(cnt >= 100)        return -1;    else        return cnt; } ​ int isprime(int x) {    if(x < 2)        return 0;    for(int i = 2; i * i <= x; i++){        if(x % i == 0)            return 0;   }    return 1; } ​ int main() {    int a, b;    scanf("%d%d", &a, &b);    for(int i = a; i <= b; i++){        fun(i);//先找出所有依附于其他数字的数字   } ​    int cnt = 0;    for(int i = a; i <= b; i++){        if(vis[i]){//依附于其他数字的数字,不输出            continue;       }        else{            int n = fun(i);//计算当前数的独立性            if(n != -1 && n != 100){                cnt++;                if(isprime(i))                    printf("%d %d\n", i, 2 * n);                else                    printf("%d %d\n", i, n);           }       }   }    if(cnt == 0)        printf("SAD\n");    return 0; }

    L2-3 深入虎穴 (25分)

    思路:找到入度为0的点,然后用dfs分别求出每条路之前有几个门即可。

    #include <iostream> #include<cstdio> #include<algorithm> ​ using namespace std; ​ const int maxn = 1e5 + 10; struct node {    int next;    int to; } a[maxn]; int head[maxn]; int in[maxn]; int vis[maxn];  //通完当前道路需要通过几个门 int cnt = 0;    //边的编号 int n;          //顶点数量 ​ void add(int u, int v) {    a[cnt].to = v;    a[cnt].next = head[u];    head[u] = cnt++; } ​ void dfs(int u) {    for(int i = head[u]; ~i; i = a[i].next)   {        int v = a[i].to;        if(!vis[v])       {            vis[v] = vis[u] + 1;            dfs(v);       }   } } ​ ​ int main() {    int n;    scanf("%d", &n);    for(int i = 1; i <= n; i++)   head[i] = -1; for(int i = 1; i <= n; i++)   {        int num;        scanf("%d", &num);        while(num--)       {            int to;            scanf("%d", &to);            in[to]++; //           cout<<to<<" "<<in[to]<<endl;            add(i, to);       }   }    for(int i = 1; i <= n; i++)   {        if(in[i] == 0)       {            vis[i] = 1;            dfs(i);            break;       }   }    int maxn = 0, index = 1;    for(int i = 1; i <= n; i++)   { //       cout<<i<<":"<<vis[i]<<endl;        if(vis[i] > maxn)       {            maxn = vis[i];            index = i;       }   }    printf("%d\n", index); ​    return 0; }

     

    Processed: 0.010, SQL: 8