您的位置:首页 > 其它

UVa 11489 整数游戏

2017-04-15 22:11 281 查看
https://vjudge.net/problem/UVA-11489

题意:

给出一个数字串n,两个人轮流从中取出一个数字,要求每次取完之后剩下的数是3的倍数,不能取数者输。

思路:

要想取掉一个数后总和还是的倍数,那么取掉的数必须得是3的倍数。

分两种情况:

①数字串总和为3的倍数,此时只需要看数字串中3的倍数的个数,奇数个的话先手赢,否则后手赢。

②数字串总和不为3,那么它会余1or余2,如果余1,那么查看数字串中是否存在%3后余1的数,如果有,则转化成了①情况,否则先手就输。(同理分析余2)

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;

char s[1005];

int main()
{
int T;
scanf("%d",&T);
int kase=0;
while(T--)
{

cin>>s;
int sum=0;
int num_0=0,num_1=0,num_2=0;
int len=strlen(s);
printf("Case %d: ",++kase);
for(int i=0;i<len;i++)
{
if((s[i]-'0')%3==0)  num_0++;
else if((s[i]-'0')%3==1)  num_1++;
else if((s[i]-'0')%3==2)  num_2++;
sum+=s[i]-'0';
}
if(sum%3==0)
{
if(num_0%2)   printf("S\n");
else  printf("T\n");
}
else
{
if(sum%3==1)
{
if(num_1 && num_0%2==0)  printf("S\n");
else   printf("T\n");
}
else if(sum%3==2)
{
if(num_2 && num_0%2==0)  printf("S\n");
else   printf("T\n");
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: