1. 程式人生 > >HDU 6266 Hakase and Nano——思維

HDU 6266 Hakase and Nano——思維

首先明確這是一個不公平的遊戲,作弊的那個人一定更有利,由此猜測所有作弊的人必勝,除非條件實在太差, 我們要找的就是這些作弊也挽回不了的局面,思考後可發現作弊的一方拿只有一個石子的石頭堆沒有辦法,因此從這上面出發,得到下面的結論:

1.先手時必勝,除非石子總數是三的倍數且每一堆都只有一個石子

2.後手時若對手能給你構造出第一種局面的話那麼你必敗,否則必勝

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
int T, n, d, a[maxn];
int main() {
    scanf("%d", &T);
    while (T--) {
        scanf("%d%d", &n, &d);
        for (int i = 1; i <= n; i++) {
            scanf("%d", &a[i]);
        }
        if (d == 1) {
            bool ok = true;
            for (int i = 1; i <= n; i++) {
                if (a[i] != 1) { ok = false; break; }
            }
            if (ok) {
                if (n % 3 == 0) puts("No");
                else puts("Yes");
            }
            else puts("Yes");
        }
        else {
            int cnt = 0;
            bool ok = true;
            for (int i = 1; i <= n; i++) {
                if (a[i] == 1) cnt++;
                else ok = false;
            }
            if (ok) {
                if (n % 3 == 1) puts("No");
                else puts("Yes");
            }
            else {
                int x = n - cnt;
                if (x == 1 && (n % 3 == 1 || n % 3 == 0)) puts("No");
                else puts("Yes");
            }
        }
    }
    return 0;
}