Codeforces 549 C The Game Of Parity【ゲーム】

3057 ワード

C言語誤り訂正大会の問題は、ちょうどゲームを補う~~コードを書くのに少し奇抜だ.しかし、直接上で変更しました.の
タイトルリンク:
http://codeforces.com/problemset/problem/549/C
タイトル:
あなたにn個の数をあげて、2人は順番に1個の数を持って行って、最後に残ったk個の数の和が奇数であれば、先手が勝って、さもなくば後手が勝つ.誰が勝つか聞く?
分析:
最後に順番に操作します:この時k+1個の数があります.の最後の操作が先手であれば、
  • 残りはすべて偶数で、先手は
  • に負けます.
  • 残りはすべて奇数で、数字の個数は偶数で、1つ持って行った後、先手が勝って、さもなくば後手が勝った.
  • 残りの数に奇数があれば、先手は奇数の偶数の中で適当に1つを選んで必ず最後と奇数にすることができて、先手は勝つことができます.

  • 最後の操作が後手であれば、
  • の場合は先手とは正反対ですが、奇有偶の場合に注意すると、後手は必ず残りの和を偶数にする方法があるので、後手が勝つことになります.
  • 残りが全て奇数で個数も偶数の時だけ後手が負ける...

  • コード:
    #include<algorithm>
    #include<cstdio>
    using namespace std;
    int n1,n2,n,k,even,odd,i,c,f;
    int Solve(){
      if (n==k) return odd % 2;
      if (n1>n2){//s
        if (n2>=odd) return 0;
        if (n2<even) return 1;
        return  k % 2;//     
      }
      else{
        if (n1>=even) return k % 2;//     
        return 0;
      }
    }
    int main(){
      while (scanf("%d%d",&n,&k)==2){
        odd=0;
        even=0;
        n1=(n-k+1)/2;
        n2=(n-k)/2;
        for (i=1;i<=n;i++){
          scanf("%d",&c);
          if (c % 2) odd++;
          else even++;
        }
        f=Solve();
        if (f) printf("Stannis
    "
    ); else printf("Daenerys
    "
    ); } return 0; }