yokobuttonの不定期で競技プログラミングをするブログ

不定期で解けた競技プログラミングコンテストの問題を載せています。

AtCoder Beginner Contest 244 C - Yamanote Line Game

問題の要約
 T君とA君は2人で次の対戦ゲームをする。
 T君が先手でゲームを始め、ゲームが終了するまでの間、2人は交互に1以上2N+1以下の整数を1つずつ宣言する。
 どちらかが一度でも宣言した整数は、それ以降どちらも二度と宣言することは出来ない。先に整数を宣言することができなくなった法のプレイヤーの負けとなり、負けなかった方のプレイヤーの勝ちとなる。
 このゲームでは必ずT君が勝つ。T君の立場で実際にゲームを行い、ゲームに勝て。
制約
 1<=N<=1000
入出力
 この問題はインタラクティブな問題(作成したプログラムとジャッジプログラムが入出力を介して対話を行う形式の問題)。
 作成したプログラムがT君の立場で、ジャッジプログラムがA君の立場でゲームを行う。
 まず、作成したプログラムに標準入力から正の整数Nが与えられる。その後、ゲームが終了するまで下記の手順を繰り返す。
  1,作成したプログラムが、T君が宣言する整数として、1以上2N+1以下の整数を標準出力する。
  2,ジャッジプログラムによって、A君が宣言する整数が作成したプログラムに標準入力から与えられる。
   ただし、A君が宣言できる整数が残っていない場合、代わりに0が与えられT君の勝ちでゲームが終了する。
 注意点
  出力を行うたびに標準出力をflushしなさい。
  T君の勝ちでゲームが終了したあと、作成したプログラムは直ちに終了しなければならない。
  ゲームの途中で不正な出力を行った場合は不正解となるが、そのときのジャッジ結果は不定
考え方
 1,Nが少ないので、小さい方からまだどちらも宣言していない整数を出力する。

実際のプログラム
#include<iostream>
#include<vector>

using namespace std;

int main(){
  int N;
  cin >> N;
  
  vector<bool> num(2*N+1+1,true);
  num[0] = false;
  
  int T;
  int A;
  
  do{
    for(int i = 1; i < 2*N+1+1; i++){
      if(num[i]){
        T = i;
        num[T] = false; 
        break;
      }
    }
    cout << T << endl;
    flush(cout);
    
    cin >> A;
    num[A] = false;
    
  }while(A != 0);
  
  return 0;
}