Codeforces 1161C(博弈)

自己的一点想法

  • 举几个例子后发现是谁先手痒痒把某一堆掏空了那他就GG了,因此要尽量让对方不得不掏空某堆。
  • 用最简单的举例后发现:1 1 1 1 1 1,扔给谁谁完蛋;1 1 1 1 1 2,一样的,肯定得动1的部分;1 1 1 1 2 2,还是败;1 1 1 2 2 2,这个就不一样了,这是胜局面,因为可以不必动1,而且将败局面1 1 1 1 1 1扔给对方。至此可以对要使用的策略有模糊的认知。
  • 考虑更常规的:1 2 3 4 5 6,怎么丢给对方差局面?抓2 3 4,使其变成1 1 1 1 5 6,会发现这和1 1 1 1 2 2其实是一样的结局;10 10 20 20 30 30,如果根据之前的认知直观感受,我们抓20 20 30的,变成10 10 10 10 10 30扔给对手,这个情况和1 1 1 1 1 3一样吗?一样。因为对手必须得动最小的那一堆,他这次虽然没有归0,比如变成10 10 10 9 9 29(最后一个随意辣),但我方此时就9 9 9 9 9 29,所以就是赢的。
  • 非要较真,就不拿20 20 30的,就要拿10 10 30呢……比如变成9 9 20 20 30 29,那对方就可以下黑手了,将其变成9 9 9 9 9 30,你输了。
  • 综上,其实这个博弈的结果一开始就是定好了的,如果与最小的不同的数量小于n / 2,则先手败,否则先手胜。
int n, a[55];

int main() {
    cin >> n;
    rep(i, 0, n - 1)    cin >> a[i];
    sort(a, a + n);
    int dif = 0;
    rep(i, 1, n - 1)
        if (a[i] != a[0])
            dif++;
    if (dif < n / 2)    puts("Bob");
    else    puts("Alice");
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/AlphaWA/p/10961630.html