牛客小白月赛33

A.字符统计
题解:模拟。比赛的时候在思考怎么输出最后一个样例,结果发现比赛上面自测能输出,应该是遇到‘\0’结束。然后注意下didn’t是一个单词,根据空格统计单词,而且输入字符串应当合法。

#include
#include
char s[1100];
int main()
{
     
    int t;scanf("%d", &t);
    getchar();
    while (t--){
     
        int line = 0, word = 0, ch = 0;
        while (gets(s) && strcmp(s, "=====")){
     
            int l = strlen(s), ok = 0;
            line++, ch += l;
            for (int i = 1; i < l; i++){
     
                if (s[i] == ' ' && s[i - 1] != ' ') ok = 1, word++;
            }
            if (ok) word++;//最后一个空格后面有单词
        }
        printf("%d %d %d\n", line, word, ch);
    }
}

B.连分数
题解:思维。类似于辗转相除法,除数作被除数,余数作除数。

#include
using namespace std;
int main()
{
     
    int t;scanf("%d", &t);
    while (t--){
     
        int a, b;scanf("%d%d", &a, &b);
        printf("%d/%d = ", a, b);
        if (a % b == 0){
     
            printf("%d\n", a / b);
            continue;
        }
        int cnt = 0;
        while (a % b){
     
            cnt++;
            printf("%d", a / b);
            int num1 = b, num2 = a % b;
            a = num1, b = num2;
            if (a % b == 0){
     
                printf("+1/%d", a / b);
                for (int i = 1; i < cnt; i++)
                    printf("}");//‘}’对应‘{’的数量
                printf("\n");
                break;
            }
            else printf("+1/{");
        }
    }
}

D.购物
题解:模拟。

#include
using namespace std;
struct node
{
     
    char str[150];
    int num;
}k[110];
int main()
{
     
    int t;scanf("%d", &t);
    while (t--){
     
        int s, n;scanf("%d%d", &s, &n);
        for (int i = 0; i < s; i++)
            scanf("%s%d", k[i].str, &k[i].num);
        while (n--){
     
            map<string, int>mp;
            int a;char b[150];
            scanf("%d", &a);
            while (a--){
     
                scanf("%s", b);
                mp[b] = 1;
            }
            for (int i = 0; i < s; i++)
                if (!mp[k[i].str] && k[i].num > 0) k[i].num--;
        }
        int res = 0;
        for (int i = 0; i < s; i++)
            if (k[i].num) res++;
        if (!res) printf("Need to be lucky\n");
        else printf("%d\n", res);
    }
}

E.喝可乐
题解:枚举。数据小,枚举蜂蜜和生姜可乐的数量。

#include
using namespace std;
int main()
{
     
    int t;scanf("%d", &t);
    while (t--){
     
        int n, a, b;scanf("%d%d%d", &n, &a, &b);
        int maxn = 0;
        for (int i = 0; i <= n; i++){
     
            int na = i, nb = n - i;
            int num = n;
            while (na >= a || nb >= b){
     
                nb += na / a, num += na / a, na %= a;
                na += nb / b, num += nb / b, nb %= b;
            }
            maxn = max(maxn, num);
        }
        printf("%d\n", maxn);
    }
}

F.天旋地转
题解:模拟。写出四个方向对应的移动方式。这里r是逆时针,l是顺时针。

#include
using namespace std;
int main()
{
     
    int t;scanf("%d", &t);
    while (t--){
     
        int n;scanf("%d", &n);
        int p = 0;
        long long x = 0, y = 0;
        while (n--){
     
            char s;int k;
            cin >> s >> k;
            if (s == 'r'){
     
                p -= k;
                while (p < 0) p += 4;
                continue;
            }
            if (s == 'l'){
     
                p += k;
                if (p >= 4) p %= 4;
                continue;
            }
            if (!p){
     
                if (s == 'w') y += k;
                else if (s == 's') y -= k;
                else if (s == 'a') x -= k;
                else x += k;
            }
            else if (p == 1){
     
                if (s == 'w') x += k;
                else if (s == 's') x -= k;
                else if (s == 'a') y += k;
                else y -= k;
            }
            else if (p == 2){
     
                if (s == 'w') y -= k;
                else if (s == 's') y += k;
                else if (s == 'a') x += k;
                else x -= k;
            }
            else{
     
                if (s == 'w') x -= k;
                else if (s == 's') x += k;
                else if (s == 'a') y -= k;
                else y += k;
            }
            //printf("%d %d\n", x, y);
        }
        printf("%lld %lld\n", x, y);
    }
}

I.三角尼姆
题解:1.打表。和为奇,Alice赢;和为偶,Bob赢。
n<=2,每人每次只能放一个,都是A赢;n=3,考虑最优解,每人每次拿的球应当尽可能的多,那么另外一个人拿到最后一个球的可能性就越大,此时B先拿最底下三个必赢;n=4,同理B拿最底下三个必赢。通过观察不难发现与和有关。
2.思维。每人每次拿一个或三个,那么一轮就拿偶数个。所以,如果和为偶数,恰好轮到A,A拿完最后一个球,A输;如果和为奇数,B多拿一次,B拿完最后一个球,B输。

#include
using namespace std;
int main()
{
     
    int t;scanf("%d", &t);
    while (t--){
     
        int n;scanf("%d", &n);
        int sum = (n + 1) * n / 2;
        if (sum % 2) printf("Alice\n");
        else printf("Bob\n");
    }
}

你可能感兴趣的:(牛客竞赛)