分析:其实如果读懂题,梳理好条件也不是很难。题目意思n个人中有两人是狼人,说谎有两人,其中一人是好人,一人是狼人。对于第一个用例,即可判断出说谎者是1号和5号,狼人是1号和4号。
首先我们用一个vector存储所有输入数据;
再用两重循环遍历一遍,假设 i 和 j 是狼人,那么在第二重循环下,再使用一个vector标记一下当前两人是狼人,这个vector初始化值全为1,a[i] = a[j] = -1 表示这两人是狼人,其余人是好人;
再申请一个vector用于存储说谎者的编号;
下面就需要知道如何判断说谎者的条件:
自己说abs[v[k]]号是狼人(v[k]<0),然而别人并不是狼人(a[abs(v[k])] == 1)
自己说abs[v[k]]号不是狼人(v[k]>0),然而别人是狼人(a[abs(v[k])] = = -1)
即:v[k]*a[abs(v[k])] < 0
只要指定判断说谎者的条件,即两个说谎者且其中一个为狼人(lie.size()==2&&a[lie[0]]+a[lie[1]]==0),满足此条件输出即可。由于遍历的顺序是从1~n,自然会满足最小序列的要求。满足条件输出此时的 i,j,如果都不满足,输出 No Solution。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
vect