【题目链接】
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;
}