眼前一亮啊 。。。。。。一道博弈。。。。。有n堆石子(= =)可以最后有n堆不取,,,,,问剩下的是奇数还是偶数判断胜负。。。。
但是好难想的感觉。。。。。。。我想呀想呀想呀。。。。。。
恩,,,大概是这样的:分类讨论,,一是谁也不用拿,二是怎么拿都会剩下奇数和偶数,三是可以把奇数拿完,四是可以把偶数拿完。。。。。。。。。看到这里会了吗?
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int a;
char SD[2][10]={"Daenerys","Stannis"};
int main()
{
int m,n;
scanf("%d%d",&m,&n);
int i;
int dan=0;
int shuang=0;
int sum=0;
for(i=0;i<m;i++)
{
scanf("%d",&a);
if(a%2==1) dan++;
else shuang++;
sum+=a;
}
if(m==n) //没啥说的直接数吧。。。。
{
if(sum%2==1) printf("Stannis\n");
else printf("Daenerys\n");
}
else if(dan<=(m-n)/2) //可以在结束之前消灭所有奇数个的!
{
printf("Daenerys\n");
}
else if(shuang<=(m-n)/2) //可以在结束之前消灭所有偶数个的********为什么要集中消灭所有偶数?后面说
{
if(n%2==1) printf("Stannis\n");
else printf("Daenerys\n");
}
else if((m-n)%2==1) //奇和偶怎么也消灭不完的。。。。。那么谁最后消看眼剩下的找一个消就必胜!
{
printf("Stannis\n");
}
else if((m-n)%2!=1) printf("Daenerys\n");
return 0;
}
为什么要集中消灭偶数?奇数肯定消不完了,,,如果不把偶数消完,就变成了有奇有偶的情况,,那么就会决定出胜负,,,,,而两个人都足够聪明,,这么整要输的那一方肯定不会这么做对吧,,奇数消不完那就消偶数,,,偶数一定会被消完,,那就看剩下的城池有奇数个还是偶数个了。。。。。。