牛客小白月赛33

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

#include<stdio.h>
#include<string.h>
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<bits/stdc++.h>
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<bits/stdc++.h>
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<bits/stdc++.h>
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<bits/stdc++.h>
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<bits/stdc++.h>
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");
    }
}

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值