Codeforces 549 C The Game Of Parity【ゲーム】
3057 ワード
C言語誤り訂正大会の問題は、ちょうどゲームを補う~~コードを書くのに少し奇抜だ.しかし、直接上で変更しました.の
タイトルリンク:
http://codeforces.com/problemset/problem/549/C
タイトル:
あなたにn個の数をあげて、2人は順番に1個の数を持って行って、最後に残ったk個の数の和が奇数であれば、先手が勝って、さもなくば後手が勝つ.誰が勝つか聞く?
分析:
最後に順番に操作します:この時k+1個の数があります.の最後の操作が先手であれば、残りはすべて偶数で、先手は に負けます.残りはすべて奇数で、数字の個数は偶数で、1つ持って行った後、先手が勝って、さもなくば後手が勝った. 残りの数に奇数があれば、先手は奇数の偶数の中で適当に1つを選んで必ず最後と奇数にすることができて、先手は勝つことができます.
最後の操作が後手であれば、の場合は先手とは正反対ですが、奇有偶の場合に注意すると、後手は必ず残りの和を偶数にする方法があるので、後手が勝つことになります. 残りが全て奇数で個数も偶数の時だけ後手が負ける...
コード:
タイトルリンク:
http://codeforces.com/problemset/problem/549/C
タイトル:
あなたにn個の数をあげて、2人は順番に1個の数を持って行って、最後に残ったk個の数の和が奇数であれば、先手が勝って、さもなくば後手が勝つ.誰が勝つか聞く?
分析:
最後に順番に操作します:この時k+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;
}