Codeforces 1161C(博弈)

Posted alphawa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

以上是关于Codeforces 1161C(博弈)的主要内容,如果未能解决你的问题,请参考以下文章

CodeForces - 1538A Stone Game博弈

CodeForces - 346A Alice and Bob博弈

CodeForces - 346A Alice and Bob博弈

CodeForces - 794C:Naming Company(博弈&简单贪心)

Codeforces 346A Alice and Bob 博弈

codeforces 768 E 变形NIM博弈/手写sg函数