【做题笔记】P1042 乒乓球

0
10

坑 #1:输入有若干行,但处理的时候要看成一个整体的信息。比如说第一行最后一局比分是 2:1 ,这时不算比完,这个比分要继承到第二行的信息中继续处理。

坑 #2:一局结束,当且仅当其中一方比分大于等于11 分且双方比分分数之差大于等于 2 。注意这是乒乓球常识而不是 OI 常识,题面中最后一句话提到了这个问题,不过不够明显。

坑 #3:两种不同的分数制度输出之间要换行。

坑 #4:在 Windows 环境下,我们判断是否读完,直接写while(cin>>s),运行时先换行,再按 Ctrl+Z,再换行就可以出结果了。

其他:注意代码细节。思路理清后大概十几分钟就能写完了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>

using namespace std;

string s;
int a[2000009],b[2000009];
//a数组记录华华某一句某时刻是否有分,b数组记录华华对手

int main()
{
	int n=0;
	while(cin>>s)
	{
		for(int i=0;i<s.length();i++)
			if(s[i]=='E')break;
			else 
				if(s[i]=='W')a[++n]=1;
				else b[++n]=1;
         //这里n不用清零,直接将所有输入作为整体
	}
	int answ=0,ansl=0;
	for(int i=1;i<=n;i++)
	{
		if(a[i])answ++;
		if(b[i])ansl++;
		if(answ>=11||ansl>=11)
		{
			if(abs(answ-ansl)>=2)
			{
				cout<<answ<<':'<<ansl<<endl;
				answ=0,ansl=0; //一局结束后分数归零
			}
		}
	}
	cout<<answ<<':'<<ansl<<endl;
	cout<<endl; //换行!!!
	answ=0,ansl=0;
	for(int i=1;i<=n;i++)
	{
		if(a[i])answ++;
		if(b[i])ansl++;
		if(answ>=21||ansl>=21)
		{
			if(abs(answ-ansl)>=2)
			{
				cout<<answ<<':'<<ansl<<endl;
				answ=0,ansl=0;
			}
		}
	}
	cout<<answ<<':'<<ansl<<endl;
	return 0;
}

<

发布回复

请输入评论!
请输入你的名字