设
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
n−k为偶数的情况:
注意到若后手取最后一个时, S o d d , S e v e n > 0 S_{odd},S_{even}>0 Sodd,Seven>0,则后手必然胜利,因为他可以根据当前情况调整取哪一个。由此,当 A < M I N { S o d d , S e v e n } A<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
  
2
,
b
=
S
e
v
e
n
m
o
d
  
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}\}
A≥MIN{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 n−k为奇数的情况用相同的方法分析即可,不再赘述。
#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;
};