题意
狼人杀,给出n个玩家的断言(即认定某人是狼人或者人类),狼人总共有两个,而且恰好有1个狼和一个人类撒了谎。如果有多个答案就输出”最小“的那个。此题是20分的题,但是第一次看到的时候还是非常懵不知道如何下手,所以记录一下。
思路
此题其实就是简单的枚举题。枚举每一种情形,如果符合条件就是答案了。由于是多个答案选择 ”最小“的那个,就按照从小到大的顺序枚举就行了。
Sample Input:
5
-2
+3
-4
+5
+4
Sample Output:
1 4
#include "bits/stdc++.h"
using namespace std;
int main(){
// freopen("input.txt","r",stdin);
int n; cin >> n;
int assets[n+1]; // true: wolf
for (int i = 1; i <= n; ++i) scanf("%d",&assets[i]);
for (int i = 1; i < n; ++i) {
for (int j = i+1; j <= n; ++j) { // suppose that i and j are wolf
int lair_human = 0; int lair_wolf = 0;
for(int k = 1; k <= n; k++){ // for all players
if (lair_human > 1 || lair_wolf > 1) break;
bool lied = false;
int t = assets[k];
// saying k is wolf, but not.
if (t < 0 && abs(t) != i && abs(t) != j) lied = true;
// saying k is human but not.
if (t > 0 && (t==i || t==j)) lied = true;
if (lied) {
if (k == i || k == j) lair_wolf ++;
else lair_human ++;
}
}
if (lair_human == 1 && lair_wolf == 1){
cout << i << " " << j << endl;
return 0;
}
}
}
cout << "No Solution" << endl;
}