【题解】NOIP2003 乒乓球

这道题我交了好几次,果然还是太菜了(

说一下注意的点吧:

  • 要特判一下只有E的情况,应该输出0:0
  • 这里的11分制是指其中一个人有11分而不是总共11分
  • 要注意刚好比完一场还需要进行下一场,如果下一场没有数据应该输出0:0

具体请看代码

/* P1217 乒乓球
 * 作者: RainbowBird
 * 日期: 2020-08-18
 * 算法: 模拟
 */

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

int n, game[25 * 2500 + 5];

int main() {
    // 读入数据
    memset(game, 0, sizeof(game));
    char ch = getchar();
    while (ch != 'E') {
        if (ch == 'W') game[++n] = 1;
        else if (ch == 'L') game[++n] = 2;
        ch = getchar();
    }

    if (n == 0) n = 1;

    // 11分制
    {
        int k = 1;
        while (k <= n + 1) {
            // 进行一轮比赛
            int a = 0, b = 0, i = 1;
            while (k <= n + 1) {
                if ((a >= 11 || b >= 11) && abs(a-b) >= 2) break;

                if (game[k] == 1) a++;
                else if (game[k] == 2) b++;

                k++, i++;
            }

            // 结束这一轮比赛
            printf("%d:%d\n", a, b);
        }
    }

    printf("\n");

    // 21分制
    {
        int k = 1;
        while (k <= n + 1) {
            // 进行一轮比赛
            int a = 0, b = 0, i = 1;
            while (k <= n + 1) {
                if ((a >= 21 || b >= 21) && abs(a-b) >= 2) break;

                if (game[k] == 1) a++;
                else if (game[k] == 2) b++;

                k++, i++;
            }

            // 结束这一轮比赛
            printf("%d:%d\n", a, b);
        }
    }

    return 0;
}

posted @ 2020-08-18 15:14  RainbowBird  阅读(130)  评论(0编辑  收藏  举报