题目:给定一窜数字,两个人s,T两人轮流拿一个数字,s先拿,要求每次取完之后剩下的数应为3的倍数,不能取者输,如果先手胜,输出S,否则输出T
思路:
此题一看暴力是肯定不行的,只能找规律,推公式.
题目要求是每次取完之后剩下的数的和是3的倍数,那么这个组成这剩下的和的元素中有多少个是3的倍数呢,假设经过统计有count 个,除了这count个之外剩下的数肯定都不能被3整除,只是这些不能整除3的数的和能整除3,试想一下,要是我拿走了这其中的一个,那剩下所有数的和就肯定不能整除3,那就意味着取不了了,所以每次只能取是3的倍数的元素,知道某个人没有是3的倍数的元素可取了,就输了!!!
http://uva.onlinejudge.org/external/114/11489.pdf
Sample Input
3
4
33
771
Sample Output
Case 1: S
Case 2: T
Case 3: T
#include<stdio.h>
#include<string.h>
int main()
{
int i,j,k,n,m,L,s;
int fg=1;
char a[1100];
int cnt[10];
scanf("%d",&n);
for(i=0;i<n;i++)
{
s=0;
memset(cnt,0,sizeof(cnt));
scanf("%s",a);
L=strlen(a);
for(j=0;j<L;j++)
{
k=(a[j]-'0')%3;
s+=k;
cnt[k]++;
}
//printf("%d %d %d %d",s,cnt[0],cnt[1],cnt[2]);
if(s%3==0)
{
if(cnt[0]%2==1)
{
printf("Case %d: S\n",fg++);
}
else
{
printf("Case %d: T\n",fg++);
}
}
else if(s%3==1){
if(cnt[1]>=1)
{
if(cnt[0]%2==1)
{
printf("Case %d: T\n",fg++);
}
else printf("Case %d: S\n",fg++);
}
else printf("Case %d: T\n",fg++);
}
else if(s%3==2){
if(cnt[2]>=1)
{
if(cnt[0]%2==1)
{
printf("Case %d: T\n",fg++);
}
else printf("Case %d: S\n",fg++);
}
else printf("Case %d: T\n",fg++);
}
}
}