UVA 11489 - Integer Game 博弈
题目大意:
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"); } }
新 blog : www.hrwhisper.me