Educational Codeforces Round 90 (Rated for Div. 2) 参与排名人数12840
[codeforces 1373B] 01 Game 删除01或10的博弈
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址http://codeforces.com/contest/1373/problem/B
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
B - 01 Game | GNU C++17 | Accepted | 30 ms | 3600 KB |
题目大意:给定一个0,1构成的串,若该串中有10或01就可将其删除,否则,什么也做不了。Alice先手,Bob后手,给定一个0,1构成的串,轮到的哪位,什么都做不了,哪位就判定为输。Alice赢,输出DA,反之,输出NET。
题中例子模拟如下
1011001
DA
删除过程如下
1011001→11001→101->1
1011001→11001→110->1
1011001→11001->101->1
1011001→11001->110->1
1011001→10101->101->1
1011001→10110->110->1
1011001→10110->101->1
可以看到,无论怎么删,删除次数是一定的,由min(0的数量,1的数量)决定。
该例子中
0的数量是3
1的数量是4
删除次数是3
Alice(A),Bob(B)
1(A) 2(B) 3(A)
轮到Bob(B)无法操作,故Alice(A)赢,输出DA
AC代码如下:
#include <stdio.h>
#include <string.h>
char s[110];
int cnt[2];
int main(){
int t,n,tot,i;
scanf("%d",&t);
while(t--){
scanf("%s",s);
n=strlen(s),cnt[0]=cnt[1]=0;
for(i=0;i<n;i++)
if(s[i]=='0')cnt[0]++;
else if(s[i]=='1')cnt[1]++;
if(cnt[0]>cnt[1])tot=cnt[1];
else tot=cnt[0];
if(tot%2)printf("DA\n");
else printf("NET\n");
}
}
来源:oschina
链接:https://my.oschina.net/u/4370305/blog/4326199