HDU1907ジョン

問題の説明

リトルジョンは弟ととても面白いゲームをしています。さまざまな色のM&Mで満たされた1つの大きなボックスがあります。最初、ジョンは同じ色のM&Mをいくつか食べなければなりません。それから彼の対戦相手はターンをしなければなりません。等々。各プレイヤーは自分のターン中に少なくとも1つのM&Mを食べる必要があることに注意してください。ジョン(または彼の兄弟)が箱から最後のM&Mを食べる場合、彼はより緩いものと見なされ、新しいキャンディー箱を購入する必要があります。

どちらのプレイヤーも最適なゲーム戦略を使用しています。ジョンは常に最初に始めます。あなたはM&Mについての情報を与えられます、そしてあなたの仕事はそのような美しいゲームの勝者を決定することです。

入力

入力の最初の行には、テストケースの数である単一の整数Tが含まれます。次のTペアの行は、次の形式でテストを説明します。各テストの最初の行には、整数N(ボックス内のさまざまなM&Mカラーの量)が含まれます。次の行には、スペースで区切られたN個の整数Aiが含まれます– i番目の色のM&Mの量。

制約:
1 <= T <= 474、1
<= N
<= 47、1 <= Ai <= 4747

出力

ゲームの勝者に関する情報を含むT行をそれぞれ出力します。ジョンがゲームに勝つ場合は「ジョン」を印刷し、それ以外の場合は「ブラザー」を印刷します。

サンプル入力

2
3
3 5 1
1
1

サンプル出力

ジョン
ブラザー

アイデア

毎回1つ以上服用すると、最後の服用者は誰でも負けます。
Sは敗北状態、Tは勝ち状態、0は十分な山がない(数が1より大きい)ことを意味し、1は十分な山の数が1であることを意味し、2は十分な山の数が1より大きいことを意味します。次に、S2、T2、T1、S0、T0の合計状態があります。アバンダンスパイルが1つしかないため、S1状態はありません。ローンパイルの数が偶数の場合、このアバンダンスパイルは残り、ローンパイルの数は1になります。ローンパイルの数が奇数の場合、十分な山がすべて取り出され、孤独な山はまだ奇妙です。
これらの種類の変換が発生する可能性がありますS2-> T2 S2-> T1 T2-> S2 T1-S1 T0-> S0 S0-> T0
最終プロセスはS2-> T2-> S2->……-> T2-> S1です-> S0-> T0->……-> S0-> T0
まとめ十分なパイルがない場合、パイルの数は最初に勝つための偶数です。十分なパイルがある場合、排他的論理和の合計は次のようになります。最初に勝つために0ではない

コード

#include<iostream>
using namespace std;

int main()
{
    
    
	int t;
	cin>>t;
	while(t--)
	{
    
    
		int n;
		cin>>n;
		int a[51],s=0,cnt=0;
		for(int i=1;i<=n;i++)
		{
    
    
			cin>>a[i];
			if(a[i]>1)
				cnt=1;
			s^=a[i];
		}
		if(!cnt&&!s)
			cout<<"John"<<endl;
		else if(cnt&&s)
			cout<<"John"<<endl;
		else
			cout<<"Brother"<<endl;
	}
	return 0;
} 

おすすめ

転載: blog.csdn.net/m0_54621932/article/details/113996372