51nod 1430 奇偶游戏

A A A表示先手总共取的个数, S o d d S_{odd} Sodd表示奇数项的数目, S e v e n S_{even} Seven表示偶数项的数目。
首先我们分析后手取的个数亦为 A A A,即 n − k n-k nk为偶数的情况:

注意到若后手取最后一个时, S o d d , S e v e n &gt; 0 S_{odd},S_{even}&gt;0 Sodd,Seven>0,则后手必然胜利,因为他可以根据当前情况调整取哪一个。由此,当 A &lt; M I N { S o d d , S e v e n } A&lt;MIN\{S_{odd},S_{even}\} A<MIN{Sodd,Seven}时,后手必胜。更进一步,若 M I N { S o d d , S e v e n } = S o d d MIN\{S_{odd},S_{even}\}=S_{odd} MIN{Sodd,Seven}=Sodd,则后手直接取完奇数项,使得剩余项的和必然为偶数,后手必胜;

所以只需要考虑 M I N { S o d d , S e v e n } = S e v e n MIN\{S_{odd},S_{even}\}=S_{even} MIN{Sodd,Seven}=Seven的情况:
a = S o d d m o d &ThinSpace;&ThinSpace; 2 , b = S e v e n m o d &ThinSpace;&ThinSpace; 2 a=S_{odd}\mod 2,b=S_{even}\mod 2 a=Soddmod2,b=Sevenmod2
a = b = 0 a=b=0 a=b=0时,因为 A ≥ M I N { S o d d , S e v e n } A\ge MIN\{S_{odd},S_{even}\} AMIN{Sodd,Seven},后手直接取完偶数项,剩余必然还要取偶数个奇数项,则最终结果必然为偶数,后手胜;
a = b = 1 a=b=1 a=b=1时,后手直接取完偶数项,剩余必然还要取奇数个奇数项,则最终结果必然为偶数,后手胜;
a = 0 , b = 1 a=0,b=1 a=0,b=1 a = 1 , b = 0 a=1,b=0 a=1,b=0时,先手直接取完偶数项,则剩余必然还要取偶数个或奇数个奇数项,最终结果必然为奇数,先手胜。

n − k n-k nk为奇数的情况用相同的方法分析即可,不再赘述。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<climits>
#include<cstdio>
#include<cmath>
using namespace std;
#define clr(a) memset(a,0,sizeof(a))
//--Container
//--
typedef long long ll;
int ar[2],n,k;
bool cl(){
    int i,j;if(scanf("%d %d",&n,&k)==-1)return 0;for(clr(ar),i=0;i<n;++i){
        scanf("%d",&j);ar[j&1]++;
    }
    if(n==k)printf("%s\n",ar[1]&1?"Stannis":"Daenerys");
    else{
        j=(n-k)>>1;if(j<min(ar[0],ar[1]))printf("%s\n",(n-k)&1?"Stannis":"Daenerys");
        else if(ar[1]<=ar[0]){
            printf("%s\n","Daenerys");
        }
        else{
            if(!((ar[0]&1)^(ar[1]&1)))printf("%s\n",(n-k)&1?"Stannis":"Daenerys");
            else
                printf("%s\n",(n-k)&1?"Daenerys":"Stannis");
        }
    }
    return 1;
};
int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
#endif
    while(cl());
    return 0;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值