2019 ACM ICPC 南京站 H. Prince and Princess

Posted wulitaotao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2019 ACM ICPC 南京站 H. Prince and Princess相关的知识,希望对你有一定的参考价值。

题意

王子想要娶公主,但是需要完成一个挑战:在一些房间中找出公主在哪。

每个房间有一个人,他们彼此知道谁在哪个房间。可以问他们三种问题:

  • 你是谁?
  • 在某个房间是谁?
  • 公主在哪个房间?

有三类人,一类一定说真话,一类一定说假话,一类可能说真话可能说假话。

王子知道这三类人的人数分别为 (a), (b), (c),求能否通过问一些问题找到公主在哪,如果能,输出最少需要的问题数。

思路

第三类人有可能说假话,因此最坏情况就是说假话,所以把他们视为第二类人。

首先问所有人第三个问题,那么最坏情况就是说真话的人都说出公主的位置,说假话的人都选择一个不是公主的人说他是公主。所以最后只会问到两个位置。那么只要说真话的人数量比较多,就一定能确认公主在哪个房间。否则是无法确定的。所以我一开始以为问问题的次数为 (a + b + c)

后来队友给了个样例,发现其实不需要问这么多,只要说真话的人比说假话的人多就行。也就是说假话的只有 (b + c) 个人,那么只要再问说真话的 (b + c + 1) 个人就可以了。

还有特殊情况,就是所有人都说真话,只要问一个人就行了。

还有更特殊的情况(队友想到的),就是 (1 0 0) 的情况,不需要问问题,因为那个人就是公主。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int main() {
    ll a, b, c;
    cin >> a >> b >> c;
    if(b == 0 && c == 0) {
        cout << "YES" << endl;
        if(a == 1) cout << 0 << endl;
        else cout << 1 << endl;
    } else if(a > b + c) {
        cout << "YES" << endl;
        cout << (b + c) * 2 + 1 << endl;
    } else {
        cout << "NO" << endl;
    }
    return 0;
}

以上是关于2019 ACM ICPC 南京站 H. Prince and Princess的主要内容,如果未能解决你的问题,请参考以下文章

2019-ACM-ICPC-南京区网络赛-D. Robots-DAG图上概率动态规划

2018-2019 ACM-ICPC南京 M. Mediocre String Problem(SAM+PAM)

2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 H. Skiing (拓扑排序+假dp)

ACM-ICPC 2018 徐州赛区网络预赛 H. Ryuji doesn't want to study

ACM-ICPC 2018 徐州赛区网络预赛 H. Ryuji doesn't want to study (线段树)

2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 H. Skiing