题解 UVA1566 John
题目描述
两个人轮流取石子,每人每次可以取 1 到
具体思路
特判情况:
-
若堆数不为 1 且每堆数量都为 1,若有奇数堆,先手必败,否则,先手必胜。
-
若堆数不为 1 且只有一堆不是 1,若有奇数堆,那堆先手拿剩一个,若有偶数对,那堆先手拿完。都可以转化为第一种情况,先手必胜。
一般情况:
-
若异或和为 0,无论怎么取,对方总能让你异或和为 0,先手必败。
-
若异或和不为 0,首先可以保证对方异或和为 0。
考虑先手状态:
-
偶数个 1,先手必胜。
-
奇数个 1,那么对方取之前异或和一定不为 0(可以手模),不成立。
-
特判情况 2,先手必胜。
综上所述,若异或和不为 0,先手必胜。
Code
#include<bits/stdc++.h>
using namespace std;
const int N=51;
int a[N];
int main(){
int t;scanf("%d",&t);
while(t--){
int n,ans=0,sum=0;scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
ans=ans^a[i];
sum=sum+a[i];
}
if(sum==n){
if(n&1)puts("Brother");
else puts("John");
}
else{
if(ans)puts("John");
else puts("Brother");
}
}
return 0;
}
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通