题解:CF2107B Apples in Boxes
wwwidk1234 · · 题解
题目
有
胜负规则:
- 如果不存在有效的盒子,那么当前玩家判负。
- 如果在拿完苹果之后
a 的最大值与最小值之差>k ,那么当前玩家判负。
汤姆和杰瑞都绝顶聪明,如果他们都以最佳策略操作,求出赢家。
思路
记
可以发现,如果第一步无论怎么操作都会导致
在进行
综上所述,
- 当
\max \left\{ a_{\max}-1,a_{\max^\prime} \right\} - a_{\min} > k 时,汤姆第一步无论如何操作都会失败,那么胜者为杰瑞; - 否则,当
\sum a_i 为奇数时,汤姆获胜,否则杰瑞获胜。
代码
Submission #318717187.
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
constexpr int N=1e5+7;
int a[N],n,k;
inline bool solve()
{
cin>>n>>k;
ll mx1=0,mx2=0,mn=1.2e18;
ll s=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]>mx1) mx1=a[i];
else if(a[i]>mx2) mx2=a[i];
if(a[i]<mn) mn=a[i];
s=(s+a[i])%2;
}
mx1--;
// cerr<<mx1<<' '<<mx2<<' '<<mn<<endl;
if((max(mx1,mx2)-mn)>k) return 0; //开幕雷击情况
if(s%2==1) return 1;
else return 0;
}
int main()
{
// freopen("neuvillette.in","r",stdin);
// freopen("neuvillette.out","w",stdout);
int T;
cin>>T;
while(T--) puts(solve()?"Tom":"Jerry");
return 0;
}
/*
操作直到数组为[0,0,0,...]的次数:sigma(a)
*/