sdut2190-救基友记1

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: 
****************************************************/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值