您的位置:首页 > 其它

Code Forces 276 B. Little Girl and Game 贪心

2013-11-07 19:50 169 查看
给出一个字符串,然后两个人依次进行操作

每次操作可以选择任意一个字符将其去除

如果一个人进行操作之前,他将现有的字符串进行排列之后可以得到一个回文串,那么他将胜利。两个人都会选择自己的最优策略

构成回文的条件很显然是出现奇数次字符的个数为0或者1

如果一个字符x出现了偶数次,那么这个字符对结果没有影响。

因为如果第一个人(可以)选择它,那么第二个人面对的肯定是一个无法胜利的局面,因为第一个人选择x之前应该面对了>=2个出现了奇数次的字符,否则直接胜利。

那么他选择完x,第二个人面对的是>=3个出现了奇数次的字符,一定不会胜利。此时第二个人的最优策略肯定是将不能胜利的局面返回给第一个人,操作时选择任意一个出现了奇数次的字符。然后第一个人将面对一个和选择x之前情况一样的局面(面对>=2哥出现奇数次的字符)。那么第一个选择出现偶数次字符的操作可以忽略掉。

所以任何一个人选择出现偶数次的字符对结果都没有影响。

只考虑出现了奇数次的字符

如果没有出现奇数次的字符,那么第一人直接胜利

如果出现奇数个出现了奇数次的字符那么(无视掉出现偶数次的字符后)每次操作将去除掉一个出现奇数次的字符,如果第一人去掉一个,第二人去掉一个,剩余的一定还是奇数

那么最终面对1个出现奇数次字符的人一定是第一个人。

否则如果出现偶数个出现了奇数次的字符,第一人选择一个之后变成了第二个人面对 出现奇数个出现了奇数次的字符,

那么最终面对1个出现奇数次字符的人一定是第二个人。

#include<stdio.h>
#include<string.h>
int num[261];
int main(){
char str[11111];
while(scanf("%s",&str)!=EOF){
memset(num,0,sizeof(num));
for(int i=0;str[i];i++){
num[str[i]-'a']++;
}
int sum=0;
for(int i=0;i<=26;i++){
sum+=num[i]%2;
}
if(sum&1||sum==0)printf("First\n");
else printf("Second\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: