静かで孤独な日記

のんびりたまに

yukicoder No.582 キャンディー・ボックス3

  • 僕の大っ嫌いなゲームの必勝法考える奴です。
  • 本当に苦手なんで誰かゲームの必勝法がわかる必勝法とか教えてください。
  • 今回は出てきませんでしたけどnimみたいなxorとか出てくるのできる気がしないんですよね。
  • 深く考え過ぎて解説見たらただの場合分けとかあるし。
  • そんな僕でも今回は寝ながら考え抜いた結果自力でAC出来ました!(嬉しい)
  • この問題探索とかやっても数が大きい場合にはTLEしちゃうので簡単な必勝法があるはずですよね(制約を見てそう思いました)。
  • あとは圧倒的なBの有利性。(ここで数が多い時はおおよそBが勝つんじゃないかと思いました)
  • とすると、Bがいつ負けるのかを考えることに。。
  • 元から箱の中のキャンディーの数が1個の時とかはいくらBでもキャンディーの数を有利にコントロールするのは無理そうですよね。
  • ということは、全部1個のキャンディーしか無かったら箱の数に依存します。
  • 他には無いかなー?なんて考えるとサンプル1がヒントですよ!
  • Aが先手である事で唯一2個の箱があった場合はその2個の箱から1個取る事で勝てる時があります(その1個を取ってからは箱の個数で勝敗が別れます)
  • こんな感じで考えると場合分けできるんじゃ無いですか?(もっと良い考え方はありそうだけど)
#include<bits/stdc++.h>
using namespace std;

int n;
int a[151],b[151];

int main(){
  cin>>n;
  for(int i=0;i<n;i++){
    cin>>a[i];
  }
  int cont=0;
  for(int i=0;i<n;i++){
    if(a[i]!=0){
      b[cont]=a[i];
      cont++;
    }
  }
  n=cont;
  int gt2=0;
  int eq2=0;
  for(int i=0;i<n;i++){
    if(b[i]==2){
      eq2++;
    }else if(b[i]>2){
      gt2++;
    }
  }
  if(gt2>0 || eq2>1){
    cout<<"B"<<"\n";
  }else if(eq2==1){
    if(n&1){
      cout<<"B"<<"\n";
    }else cout<<"A"<<"\n";
  }else{
    if(n&1){
      cout<<"A"<<"\n";
    }else cout<<"B"<<"\n";
  }
  return 0;
}