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