題意
王子想要娶公主,但是需要完成一個挑戰:在一些房間中找出公主在哪。
每個房間有一個人,他們彼此知道誰在哪個房間。可以問他們三種問題:
- 你是誰?
- 在某個房間是誰?
- 公主在哪個房間?
有三類人,一類一定說真話,一類一定說假話,一類可能說真話可能說假話。
王子知道這三類人的人數分別為 \(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;
}