sdut2190-救基友记1

时间:2022-11-01 20:36:25

Problem Description
WP的好基友CZ被妖怪抓走了(话说CZ这货长得太漂亮了老是勾引妖怪,不守基道…..),聪明机智的WP只好去救自己的好基友。 “妖怪快快放了我师傅,额,不对,快快放了我的基友……”。 妖怪听后怒之,要与WP玩一场智力游戏,来争夺基友。
游戏描述如下:
给出一个数字串N,两人轮流从中取出一个数字,要求每次取完之后剩下的数是3的倍数,不能取数者输。两人都足够聪明,S代表WP,WP先取,T代表妖怪,妖怪后取,谁会会获胜?

Input
输入第一行一个整数T(0 < T < 60) 接下来T行,每行有一个数字串N(N由不超过1000个非0数字组成)。

Output
Case x: y x表示第几组数据,y表示S或T

Sample Input
3
4
33
771

Sample Output
Case 1: S
Case 2: T
Case 3: T

思路:我之前隐约记得看过别人的解法,直接就能先手判断结果的,结果wa,最后看了别人的结题报告才明白这个和那几个博弈不大一样,这个题就需要考虑两种情况,如果能被三整除,就判断被3整除的数字的个数有奇数个还是偶数个,如果是奇数个就是妖怪输。而不能被三整除的时候,就要去看和3取余余几 ,如果余的数在原串里找得到或者是原串某个数对3取余与这个余数相等,那第一步的WP就必须拿掉这个数才符合规则,所以剩下的又是判断剩下的数中能被3整除的数是奇数个还是偶数个。这里贴上一个解释更好的博主地址:
http://blog.csdn.net/thearcticocean/article/details/46722777

代码:

#include <iostream> 
#include<cstdio>
#include<cstring>
using namespace std;
int n,i,j;
char s[1005];
int dit[3];
int main(int argc, char *argv[]) {
//freopen("cin.txt","r",stdin);
while(cin>>n){
for(i=1;i<=n;i++){
scanf("%s",s);
memset(dit,0,sizeof(dit));
int length=strlen(s),sum=0;
for(j=0;j<length;j++){
int q=s[j]-48;
sum+=q;
dit[q%3]++;
}
int step=0;
if(dit[sum%3]){
step++;
dit[sum%3]--;
}
if(step)step+=dit[0];
if(step%2)printf("Case %d: S\n",i);
else printf("Case %d: T\n",i);
}
}
return 0;
}

/***************************************************
User name:
Result: Accepted
Take time: 0ms
Take Memory: 224KB
Submit time:
****************************************************/