信息学奥赛一本通 1922:【03NOIP普及组】乒乓球 | OpenJudge NOI 1.13 37:乒乓球 | 洛谷 P1042 [NOIP2003 普及组] 乒乓球

【题目链接】

ybt 1922:【03NOIP普及组】乒乓球
OpenJudge NOI 1.13 37:乒乓球
洛谷 P1042 [NOIP2003 普及组] 乒乓球

【题目考点】

1. 字符串
2. 模拟

【解题思路】

首先要了解兵乓球的规则,无论是11分制还是21分制,要想取得胜利,胜方的分数必须比败方的分数多至少2分。如果双方分数只差1分,即便两人分数都超过了分制的最大分数,比赛也没有结束,直到一方的分数超过对方2分为止。
所以得到比赛结束的条件为:胜方的分数超过最大分数,且胜方的分数与对方的分数差值大于等于2。

读入数据,可以每次读入一个字符,将其填充至字符串,直到遇到字符’E’。或者每次读入一个字符串,将其连接成一个大的字符串,遍历时到’E’为止。

处理11分制和21分制的逻辑是一样的,可以写成一个函数。
遍历字符串,用两个变量记录双方的分数,如果满足结束比赛的条件,则结束本轮比赛,输出比分。再进行下一场比赛。
遍历字符串结束后,也要输出一次比分。注意:最后如果是“0:0”,也要输出。

【题解代码】

解法1:使用string类
#include <bits/stdc++.h>
using namespace std;
void showMatch(string s, int mp)//s:胜负字符串 mp:获胜分值 
{
    int w = 0, l = 0;//w:自己得分 l:对手得分 
    for(int i = 0; s[i] != 'E'; ++i)//遍历到E结束 
    {
        if(s[i] == 'W')
            w++;
        else
            l++;
        if(w >= mp && w-l >= 2 || l >= mp && l-w >= 2)
        {
            cout << w << ':' << l << endl;
            w = 0, l = 0;//开始下一场比赛 
        }
    }
    cout << w << ':' << l << endl;//如果是0:0,也输出。 
}
int main()
{
    string s, a;
    while(cin >> a)//将每行读入的字符串连成字符串s 
        s += a;
    showMatch(s, 11);
    cout << endl;
    showMatch(s, 21);
    return 0;
}
解法2:使用字符数组
#include <bits/stdc++.h>
using namespace std;
char s[100005];//s:胜负字符串
int len;//s的长度 
void showMatch(int mp)//mp:获胜分值 
{
    int w = 0, l = 0;//w:自己得分 l:对手得分 
    for(int i = 0; i < len; ++i) 
    {
        if(s[i] == 'W')
            w++;
        else if(s[i] == 'L') 
            l++;
        if((w >= mp || l >= mp) && abs(w-l) >= 2)//一方分数大于最大分数,且分数差值大于等于2 
        {
            cout << w << ':' << l << endl;
            w = 0, l = 0;//开始下一场比赛 
        }
    }
    cout << w << ':' << l << endl;//如果是0:0,也输出。 
}
int main()
{
    char c; 
    while((c = getchar()) != 'E')//将每行读入的字符串连成字符串s 
        s[len++] = c;//注意:也会把'\n'填到字符串中 
    showMatch(11);
    cout << endl;
    showMatch(21);
    return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值