题意:
有两个人从N个石子堆中拿石子,其中一个人可以拿两次,第二个人只能拿一次。最后拿完的人胜利。
思路:
类型 | Hakase先 | Hakase后 |
---|---|---|
1 | W | L |
1 1 | W | W |
1 1 1 (3n) | L | W |
1 1 1 1 (3n+1) | W | L |
1 1 1 1 1 (3n+2) | W | W |
类型 | Hakase先 | Hakase后 |
---|---|---|
X 1 1 | W | L |
X Y 1 | W | W |
X Y Z | W | W |
X 1 1 1 | W | L |
X Y 1 1 | W | W |
X Y Z 1 | W | W |
X 1 1 1 1 | W | W |
X Y 1 1 1 | W | W |
1.若n = 3t,若每个石子堆都是1,A先手必输(1 1 1)。只有一个数量大于1的石子堆,则B先手A必输(X 1 1)。
2.若n = 3t+1,若只有一堆柿子大于1(X 1 1 1)。则B先手A必输。
按照结论写代码。。
代码:
#include<iostream>
using namespace std;
int main() {
int t, n, d;
scanf("%d", &t);
while(t--) {
bool flag = true;
int cnt = 0, a;
scanf("%d %d", &n, &d);
for(int i = 0; i < n; i++) {
scanf("%d", &a);
if(a >= 2)
cnt++;
}
int x = n % 3;
if(x == 0) {
if(cnt==0 && d==1)
flag = false;
if(cnt==1 && d==2)
flag = false;
}else if(x == 1){
if(cnt<=1 && d==2)
flag = false;
}
if(flag) printf("Yes
");
else printf("No
");
}
return 0;
}