您的位置:首页 > 其它

UVA 11489 - Integer Game 博弈

2013-08-16 11:26 435 查看
看题传送门

题目大意:

S和T在玩游戏,S先。给出一数字串,两人轮流取出一个数字,要求每次取完之后剩下的数为3的倍数,或者没有数字留下。如果两个人足够聪明,求胜利的一方。

思路:

我一开始竟然没有输Case 直接交上去了,WA死了。笨蛋。

分情况讨论呗。

记3、6、9的个数为tsn

如果一开始和就是3的倍数,那S只能拿3、6、9,所以当这tsn为奇数个胜利~

如果一开始不是3的倍数,那S必须凑成3的倍数,所以之后tsn应该为偶数。

当然,题目还说拿完也算赢。所以只有一个数的时候S胜利。

#include<cstdio>
#include<cstring>
const int MAXN=1000+24;
int cnt[10];
char s[MAXN];
int main()
{
int T;
scanf("%d",&T);
for(int ri=1;ri<=T;ri++)
{
memset(cnt,0,sizeof(cnt));
scanf("%s",s);
int len=strlen(s),sum=0,temp;
for(int i=0;i<len;i++)
{
temp=s[i]-'0';
cnt[ temp ]++;
sum+=temp;
}

int tsn=cnt[3]+cnt[6]+cnt[9]; //three\six\nine

bool first=false;
if(len==1)
first=true;
else
{
if(sum % 3 !=0)
{
for(int i=1;i<=9;i++)
{
if(cnt[i]!=0 && (sum - i ) % 3==0)
{
if(tsn % 2 ==0)      //第一个人拿走让剩下的为3的倍数,并且3、6、9个数为2的偶数倍能胜。
first=true;
break;
}
}
}
else if(tsn % 2 !=0)   //或者一开始就是3的倍数,他需要奇数个
first=true;

}

printf("Case %d: ",ri);
if(first)
printf("S\n");
else printf("T\n");
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: