[USACO24FEB] Palindrome Game 题解

题目传送门

题目

Bessie和Elsie正在用一堆石头玩游戏,这些石头最初包含S块石头(1≤S<10105)。两头奶牛轮流转弯,贝西先走。轮到奶牛时,她必须从石头堆中取出x块石头,其中x是奶牛选择的任何正整数回文。如果轮到奶牛时,堆里是空的,那头牛就输了。

有T个(1≤T≤10)独立测试用例。对于每个测试用例,如果两头奶牛都玩得最好,打印谁赢得了游戏。

输入格式:

第一行包含T,即测试用例的数量。接下来的T行描述测试用例,每个测试用例一行。

每个测试用例都由一个整数S指定。

输出格式:

对于每个测试样例,如果Bessie在最佳游戏中获胜,则输出B,从一堆大小为S的石头开始,否则输出E,每一个一行。

样例输入

3

8

10

12

样例输出

B

E

B

回文数详情

  • (比如1~9个位数都是,121,1221,789987,45322354……,这些看起来左右对称的数)

那么我们第一眼看到 “两个人拿石子时都要最优”时第一是不是想到要用博弈论,但数据过大,无法进行。

我们不妨换一思路,可以从数学角度入手,我们寻找一下规律,Bessie是先手又要拿一个最优的回文数,所以我们不难发现,当这个石子堆里的石子数量为个位数或石子数量的个位不为0时,那么Bessie是必胜的,反之当石子数量的个位为0时Elsie必胜,我们怎么证明呢?

我们不难证明,当这个数的个位为0时,那么它的最高位应该也为0,然而我们发现这个数是没有前导0的,所以这个数的个位为0是时Elsie必胜。

以下是一个个位为0例子:

S=10

  1.  B:1 E:9
  2. E胜

以下是一个个位不为0例子:

S=72

  1.  B:54 E:11
  2.  B:2 E:8
  3.  B:2 E:0
  4. B胜

所以我们只需要根据上述的规律进行一个在程序中的转换即可。

因为这个S的数据范围极大,所以用 long long 也无法储存,所以得用字符串进行输入,取字符串的最后一位进行前面我们找出的规律模拟即可,我们只需要求出S的长度len。

len=s.size();

求出出长度后,我们可以知道S的最后一位是S[len-1],为什么?因为字符串S的第一位是S[0],也就是从0开始,那么len个字符,最后一位就为S[len-1]。

最后,是根据上面总结的AC代码。

AC代码

#include<bits/stdc++.h>
using namespace std;
string S;
int t; 
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>S;
		if(S[S.size()-1]!='0')
		{
			cout<<"B"<<endl; 
		}
		else
		{
			cout<<"E"<<endl;
		}
	}
	return 0; 
}

完结,感谢阅读。

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值