2020.07.11日常总结

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|) 1s1000,si=0(1is)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值