HDU - 6266 - HDU 6266 Hakase and Nano (博弈論)
阿新 • • 發佈:2018-09-30
hdu 一次 都是 有一個 類型 center ade printf 博弈
題意:
有兩個人從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\n"); else printf("No\n"); } return 0; }
HDU - 6266 - HDU 6266 Hakase and Nano (博弈論)