Codeforces 549C The Game Of Parity【博弈】

C语言纠错大赛的一道题,正好拿来补博弈~~
给的代码写的略奇葩。。不过还是直接在上面改了。。


题目链接:

http://codeforces.com/problemset/problem/549/C

题意:

给你n个数,两个人依次拿走一个数,最后剩下的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\n");
    else printf("Daenerys\n");
  }
  return 0;
}
posted @ 2016-03-30 23:13  zhuyujiang  阅读(209)  评论(0编辑  收藏  举报