♐ CSP_J 组真题
2003年
1. 乒乓球

线上OJ 地址:

一本通:1922:【03NOIP普及组】乒乓球 (opens in a new tab)
AcWing:413. 乒乓球 (opens in a new tab)
洛谷:P1042 [NOIP2003 普及组] 乒乓球 (opens in a new tab)

核心思想:

字符串的读入和处理

💡

char ch // ch为字符变量
cin >> ch 遇到空格或者回车就会停止读入,换句话说,不会读入空格和回车。
cin.get(ch) 能读入各种字符,包括空格,回车等。需要自己判断读入的字符种是否包含空格和回车。

💡

string str
cin >> str 遇到空格或者回车就会停止读入,所以读入的行有可能不完整。
getline(cin, str) 如果想要完整读入包含空格的字符串,可以使用 getline(cin, str)

读入字符串
#include <bits/stdc++.h> 
using namespace std;
 
void solve(string s, int n)
{
	int a = 0, b = 0;  // 必须初始化为0,因为有数据上来就是E
	int len = s.length();
	for(int i = 0; i < len; i++)
	{
		if(s[i] == 'E')  break;
		else if(s[i] == 'W')  a++;
		else if(s[i] == 'L')  b++;
		
		if( (a >= n || b >= n) && (abs(a - b) >= 2) )  // 隐藏条件,分差需在2分以上才能算赢
		{
			printf("%d:%d\n", a, b);  // 符合条件,则打印
			a = 0;  // a 和 b 都清0
			b = 0;
		}		
	}
	printf("%d:%d\n", a, b); // 跳出循环时把剩余比分输出
}
 
int main()
{
	string s, str;
	while(cin >> s)   str += s;  // 字符串叠加
	
	solve(str, 11);
	printf("\n");
	solve(str, 21);
	
	return 0;
}