2019天梯赛决赛

 

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值