tozangezan's diary

勝手にソースコードをコピペして利用しないでください。

AOJ 2686: Unfair Game

幼稚園児でも解けるような問題だった。

具体的には、

  • A=Bの時
  • 山が一つでA>Bの時
  • 山が一つでA
  • たくさん山があり、A,B>>石の個数の時

を考えてみれば自然と答えは見えてくる。

#include<stdio.h>
#include<algorithm>
using namespace std;
int p[110000];
int main(){
	int n,a,b;
	scanf("%d%d%d",&n,&a,&b);
	for(int i=0;i<n;i++)scanf("%d",p+i);
	if(a>b){
		bool ok=false;
		for(int i=0;i<n;i++)if(p[i]>b)ok=true;
		if(ok)printf("Hanako\n");
		else{
			int tmp=0;
			for(int i=0;i<n;i++)tmp^=p[i];
			if(tmp)printf("Hanako\n");
			else printf("Jiro\n");
		}
	}else if(a==b){
		int tmp=0;
		for(int i=0;i<n;i++)tmp^=p[i]%(a+1);
		if(tmp)printf("Hanako\n");
		else printf("Jiro\n");
	}else{
		int at=-1;
		for(int i=0;i<n;i++){
			if(p[i]>a){
				if(at!=-1){
					printf("Jiro\n");return 0;
				}
				at=i;
			}
		}
		if(at==-1){
			int tmp=0;
			for(int i=0;i<n;i++)tmp^=p[i]%(a+1);
			if(tmp)printf("Hanako\n");
			else printf("Jiro\n");
		}else{
			int tmp=0;
			for(int i=0;i<n;i++)if(at!=i)tmp^=p[i]%(a+1);
			int req=p[at]-tmp;
			if(req<0||req>a||tmp>a)printf("Jiro\n");
			else printf("Hanako\n");
		}
	}
}