Input
输入包含多组数据。每组数据的第一行包含一个整数N(1≤N≤18),表示双方总共罚了多少个点球,N=0表示输入结束。随后有N行,每行是一个如下形式的字符串:
XXXX good
:表示这个点球罚进
或者XXXX no good
:表示这个点球没有罚进
其中XXXX
表示球员名字(全部由字母和空格组成,保证不会出现歧义)
每一行保证不超过100个字符。
XXXX
和good
以及XXXX
和no
、no
和good
之间保证有且只有1个空格。
good
、no good
都是小写。本题是大小写相关的。
数据不保证点球大战一定结束,也不保证在结束以后立即结束这组数据(即:不用判断点球大战是否结束,只用把罚进的点球往比分上加即可)。
Output
对每组数据,输出一个比分板。一个点球如果罚进,则在对应的地方标上O
,如果没有进则标上X
。先罚球的队伍的信息在上面,后罚的在下面。最右边标上两队的比分。具体格式参考样例输出。注意如果一轮点球只罚了一个,则后面那个点球对应的地方写上-
。
解决思路
这个题解决思路倒是很简单,主要要多考虑两个因素
(1)如果一个人名最后两位为no,例如abcno good,则应该
(2)如果一个人名中包括no good,例如 abc no good good,则应该是点球罚进。
因此解决思路是判断输入长度是否大于8,小于8肯定是进了,大于8则取字符串最后8个字符的子串与" no good"进行比较,若相等则点球未罚进,否则该点球罚进。
代码如下:
#include <iostream> #include <string> using namespace std; int main() { int testCases, lines, firstTeamGoal, secondTeamGoal; string goalInfo, firstTeam, secondTeam; cin >> testCases; while (testCases != 0){ lines = 0; firstTeam = secondTeam = ""; firstTeamGoal = secondTeamGoal = 0; getline(cin, goalInfo); while (lines < testCases){ getline(cin, goalInfo); int len = goalInfo.size(); if (len >= 8){ if (goalInfo.substr(len - 8, 8) == " no good"){ if (lines % 2 == 0) firstTeam += "X "; else secondTeam += "X "; } else{ if (lines % 2 == 0){ firstTeamGoal++; firstTeam += "O "; } else{ secondTeamGoal++; secondTeam += "O "; } } } else{ if (lines % 2 == 0){ firstTeamGoal++; firstTeam += "O "; } else{ secondTeamGoal++; secondTeam += "O "; } } lines++; } if (testCases % 2 == 1) secondTeam += "- "; for (int i = 0, len = (testCases + 1) / 2; i < len; i++) cout << i+1 << " "; cout << "Score" << endl << firstTeam << firstTeamGoal << endl << secondTeam <<secondTeamGoal<< endl; cin >> testCases; } }
UESTC OJ 25
时间: 2024-10-05 04:19:03