Problem 1065 Alpha Centauri Tennis.
题意
- 好大一段题目。
外星人打网球,counting the number of balls/games/sets won by a playe.
某个人不懂外星语,仅仅记下了每一球的胜利者,判断比赛最终的胜利者
RULES FOR WINNING A GAME
当P赢下一球时:
如果P有3分,其他人都不超过2分,P胜
如果P有4分,P胜
如果其他人有4分,那个人失去1分
P得1分
RULES FOR WINNING A SET
第一个达成以下条件:
本set中赢了6场game
比其他人多赢2场game
RULES FOR WINNING A MATCH
第一个赢得至少3场set的参赛者赢得match
没有被其他玩家赢得一场game的set是完成,算赢得2场set - 输入:
多行,每行对应一场比赛。
the number of players N (2 <= N <= 26 )
a string S (长度1-1,000,000,大写字母组成) - 输出:
赢的人的字母
思路
三个数组,game[],set[],match[],分别用来计分。
每次读入数据统计,然后按题意规则判断即可。
笔记
- 我好菜啊只能按着规则敲还WA,我放弃,哪天闲着没事干再敲吧。
代码
#include<cstdio>
#include<string.h>
char s[1000010];
int ball[26], game[26], set[26];
int n, flag, player;
void yeah(int player){
int flag = 0;
for(int k=0; k<n; k++){
if(k!=player && game[k]!=0){
flag = 1;
break;
}
}
if(flag==0)
set[player]++;
}
int main(){
while(scanf("%d", &n) != EOF){
getchar();
gets(s);
memset(game, 0, sizeof(game));
memset(set, 0, sizeof(set));
memset(ball, 0, sizeof(ball));
for(int i=0; i<strlen(s); i++){
player = s[i]-'A';
//RULES FOR WINNING A GAME
if(ball[player]==3){
flag = 0;
for(int k=0; k<n; k++){
if(k!=player && ball[k]>2){
flag = 1;
break;
}
}
if(flag==0){
game[player]++;
memset(ball, 0, sizeof(ball));
}
}
if(ball[player]==4){
game[player]++;
memset(ball, 0, sizeof(ball));
}
for(int k=0; k<n; k++){
if(k!=player && ball[k]==4)
ball[k]--;
}
ball[player]++;
//RULES FOR WINNING A SET
if(game[player]==6){
set[player]++;
yeah(player);
memset(game, 0, sizeof(game));
}
flag = 0;
for(int k=0; k<n; k++){
if(k!=player && game[player]-game[k]<2){
flag = 1;
break;
}
}
if(flag==0 && game[player]!=6){
set[player]++;
yeah(player);
memset(game, 0, sizeof(game));
}
if(set[player]>=3)
break;
}
printf("%c\n", player+'A');
}
return 0;
}