列表

详情


NC20410. [SHOI2008]小约翰的游戏JOHN

描述

小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取,我们规定取到最后一 粒石子的人算输。
小约翰相当固执,他坚持认为先取的人有很大的优势,所以他总是先取石子,而他的哥哥就聪明多了,他从来没有在游戏中犯过错误。小约翰一怒之前请你来做他的参谋。自然,你应该先写一个程序,预测一下谁将获得游戏的胜利。

输入描述

本题的输入由多组数据组成第一行包括一个整数T,表示输入总共有T组数据(T ≤ 500)。
每组数据的第一行包括一个整数N(N ≤ 50),表示共有N堆石子,接下来有N个不超过5000的整数,分别表示每堆石子的数目。

输出描述

每组数据的输出占一行,每行输出一个单词。
如果约翰能赢得比赛,则输出“John”,否则输出“Brother” ,请注意单词的大小写。

示例1

输入:

2 
3 
3 5 1 
1 
1

输出:

John
Brother

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 4ms, 内存消耗: 436K, 提交时间: 2021-11-08 21:35:23

#include<stdio.h>
int main(void)
{
	int n,m,s,a,sum,i;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%d",&m);
		s=sum=0;
		for(i=1;i<=m;i++)
		{
			scanf("%d",&a);
			s^=a;
			if(a>1)
			sum++;//充裕堆个数 
		}
		if((sum==0&&m&1)||(!s&&sum>1))
		printf("Brother\n");
		else 
		printf("John\n");
	}
	return 0;
}

C++ 解法, 执行用时: 6ms, 内存消耗: 484K, 提交时间: 2021-08-18 16:40:01

# include<iostream>
using namespace std;
int main(){
	int t,n,m,max;
	int a,ans;
	cin>>t;
	while(t--){
		cin>>n;
		m=n;
		ans=0;
		max=0;
		while(n--){
			cin>>a;
			ans=ans^a;
			if(max<a)
			max=a;
		}
		if((!ans&&max>1)||(ans&&max==1))
		cout<<"Brother\n";
		else
		cout<<"John\n";
	}
	return 0;
}

上一题