您的位置:首页 > 其它

UVA 11489- Integer Game

2016-07-20 11:10 441 查看


题目链接

题目解析

题意

输入数据的组数t,每组数据包含一连串的数字,S先取T后取,使取后的数字之和为3的倍数(0也3的倍数),直到不能取算作输,输出赢的字符。

思路

所有数字的和sum,对3取余的结果,等于每个数字对3取余的和再对3取余的结果。

一:

启发于博客

每个数字对3取余结果为0,1,2的数量分别设为num,num1,num2。

总共有两种情况:

1、起初sum是3的倍数,要保证取后数字和为3的倍数,就只能取3的倍数(3,6,9……),若num为偶数T赢,否则S赢。

2、起初sum不是3的倍数,要么取余为1,要么取余为2,S取完后若是3的倍数,同理第一种情况继续分析,否则T赢。

sum对3取余为1又分为:

num1>0,所输入的字符串对3取余情况(1 0 0,1 0,1)

和num1=0,所输入的字符串对3取余情况(2 2 0,2 2)。

取余为2同理。

代码

#include<stdio.h>
#include<string>
#include<iostream>
using namespace std;
int main(){
int T,cas=1,sum,num,num1,num2;
string s;
scanf("%d",&T);
while(T--){
cin>>s;
sum=num=num1=num2=0;//初始化
int len=s.length();//求字符串长度
for(int i=0;i<len;i++){
int k=s[i]-'0';
sum+=k;
if(k%3==0)//每个数字k对3取余并统计数量
num++;
else if(k%3==1)
num1++;
else
num2++;
}
if(sum%3==0){//分情况讨论所有数字和sum对3取余
if(num%2==0)
printf("Case %d: T\n",cas++);
else
printf("Case %d: S\n",cas++);
}
else if(sum%3==1){
if(num1>0){
if(num%2==0)
printf("Case %d: S\n",cas++);
else
printf("Case %d: T\n",cas++);
}
else
printf("Case %d: T\n",cas++);
}
else{
if(num2>0){
if(num%2==0)
printf("Case %d: S\n",cas++);
else
printf("Case %d: T\n",cas++);
}
else
printf("Case %d: T\n",cas++);
}
}
return 0;
}


二:

思路同一,只是代码简化

代码

#include<stdio.h>
#include<string.h>
using namespace std;
#define MAX 1005
char str[MAX];
int a[3];
int main(){
int T,cas=1;
memset(a,0,sizeof(a));
scanf("%d",&T);
while(T--){
scanf("%s",str);
memset(a,0,sizeof(a));
int sum=0;
int len=strlen(str);//字符串常量str第一个'\0'前的字符个数
for(int i=0;i<len;i++){
a[(str[i]-'0')%3]++;//str[i]存储一个数字字符,str[i]-'0'得到该数字的值
sum+=str[i]-'0';
}
int flag=0;
if(a[sum%3]){
flag=1;
a[sum%3]--;//主要目的是将sum对3取余为0的个数-1,取余为1和2个数-1没影响
}
if(flag)
flag+=a[0];
printf("Case %d: %s\n",cas++,flag%2==1?"S":"T");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: