题目链接:
https://pintia.cn/problem-sets/994805260223102976/problems/1038429385296453632
AC代码:
#include <iostream>
#include <cmath>
#include <vector>
#include <cstdio>
using namespace std;
int main(){
int n;
scanf("%d",&n);
vector<int> v(n+1);
for(int i=1;i<=n;i++)
scanf("%d",&v[i]);
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){//从i+1开始,而非i
//初始条件下,均为好人
vector<int> lie,a(n+1,1);
//记录i与j为狼人
a[i]=a[j]=-1;
for(int k=1;k<=n;k++)
if(v[k]*a[abs(v[k])]<0)
//k说的话与实际情况不同
//若k说v[k]是狼人,但a[v[k]]大于0,表示v[k]是好人,则代表k说话与实际不符
//若k说v[k]是好人,但a[v[k]]小于0,表示v[k]是坏人,也代表k说话与实际不符
lie.push_back(k);
//如果说谎者人数为2,且说谎者中,一个为好人(+1),一个为狼人(-1)
if(lie.size()==2&&a[lie[0]]+a[lie[1]]==0){
printf("%d %d",i,j);
return 0;
}
}
}
printf("No Solution");
return 0;
}