UVA11489 Integer Game \color{green}{\texttt{UVA11489 Integer Game}} UVA11489 Integer Game
[Problem-What you need to do] \color{blue}{\texttt{[Problem-What you need to do]}} [Problem-What you need to do]
- 有两个人轮流从字符串中删去一个数,要求删去之后剩下的字符组成的数字能被 3 3 3 整除。不能删去满足条件的数字或字符串已为空则输。
- 假定两人都采用最优策略,求先手的胜负。
- 多组数据,每组数据输出一行一个字符,若先手必胜则是
S
,否则是T
。 - 记 s s s 为原字符串, ∣ s ∣ |s| ∣s∣ 表示其长度,则 1 ≤ ∣ s ∣ ≤ 1000 , s i ≠ 0 ( 1 ≤ i ≤ ∣ s ∣ ) 1 \leq |s| \leq 1000,s_{i} \neq 0(1 \leq i \leq |s|) 1≤∣s∣≤1000,si=0(1≤i≤∣s∣)。
[Soluntion-How you can do it] \color{blue}{\texttt{[Soluntion-How you can do it]}} [Soluntion-How you can do it]
如果 s s s 本来就是 3 3 3 的倍数的话,那么我们只能取走 3 , 6 , 9 3,6,9 3,6,9 中的一个,否则余下的数就不是 3 3 3 的倍数。
于是,我们统计 3 , 6 , 9 3,6,9 3,6,9 的个数,如果为偶数,后者胜,否则前者胜。
你以为就这样就 OK 了?Naive。
注意,第一次操作前 s s s 可以不为 3 3 3 的倍数,但是第一次操作后必须是。
怎么办办呢?
很简单,枚举第一次删除了哪位数即可。
这次真的可以了。
[code-A way you can solve it] \color{blue}{\texttt{[code-A way you can solve it]}} [code-A way you can solve it]
char str[1010];//博弈论的题
int n,num,sum,test_number,g;
inline bool check(int mid){
num=sum=0;//把变量初始化
for(int i=1;i<=n;i++)
if (i!=mid){//删除mid位
sum+=str[i]-'0';//总和
num+=(str[i]-'0')%3==0;
}
if (mid!=0&&sum%3!=0)
return true;//不能取
if (sum%3==0&&num%2==1)
return true;//先手胜
else if (n==1)//全部取完
return true;//先手胜
else return false;//先手败
}
int main(){
scanf("%d",&test_number);
while (test_number--){
scanf("%s",str+1);//输入
n=strlen(str+1);//求长度
register bool flag=false;
if (check(0)) flag=true;
for(int i=1;i<=n;i++)
if (!check(i)){
flag=true;
break;
}
printf("Case %d: ",++g);
if (flag) printf("S\n");
else printf("T\n");
}
return 0;
}