ybt 1922:【03NOIP普及组】乒乓球
OpenJudge NOI 1.13 37:乒乓球
洛谷 P1042 [NOIP2003 普及组] 乒乓球
首先要了解兵乓球的规则,无论是11分制还是21分制,要想取得胜利,胜方的分数必须比败方的分数多至少2分。如果双方分数只差1分,即便两人分数都超过了分制的最大分数,比赛也没有结束,直到一方的分数超过对方2分为止。
所以得到比赛结束的条件为:胜方的分数超过最大分数,且胜方的分数与对方的分数差值大于等于2。
读入数据,可以每次读入一个字符,将其填充至字符串,直到遇到字符’E’。或者每次读入一个字符串,将其连接成一个大的字符串,遍历时到’E’为止。
处理11分制和21分制的逻辑是一样的,可以写成一个函数。
遍历字符串,用两个变量记录双方的分数,如果满足结束比赛的条件,则结束本轮比赛,输出比分。再进行下一场比赛。
遍历字符串结束后,也要输出一次比分。注意:最后如果是“0:0”,也要输出。
#include解法2:使用字符数组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; }
#includeusing 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; }


![信息学奥赛一本通 1922:【03NOIP普及组】乒乓球 | OpenJudge NOI 1.13 37:乒乓球 | 洛谷 P1042 [NOIP2003 普及组] 乒乓球 信息学奥赛一本通 1922:【03NOIP普及组】乒乓球 | OpenJudge NOI 1.13 37:乒乓球 | 洛谷 P1042 [NOIP2003 普及组] 乒乓球](http://www.mshxw.com/aiimages/31/931799.png)
