题目大意:
一个狼人杀游戏,已知肯定有两头狼,其中有一头说谎,然后平民里也有一个说谎,要求找出这两头狼的编号,如果存在多个解输出字典序最小的。
解题思路:
由于数据量并不大直接暴力枚举两头狼的编号即可,维护一个身份数组,在枚举狼时将对应的下标下的数组值变为-1,其他下标是1。然后遍历每个人说的话,如果出现矛盾(所说的人的身份和我们ID数组中对应的矛盾)说明这个人说谎,将说谎人的编号保存下来,如果最后有两个人说谎并且一个是狼一个是平民,就输出答案。从小到大枚举狼可以解决字典序的问题。
代码如下:
#include<iostream>
#include<cstdio>
#include<fstream>
#include<set>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<iomanip>
#include<cstdlib>
#include<list>
#include<queue>
#include<deque>
#include<unordered_set>
#include<unordered_map>
#include<stack>
#include<algorithm>
#define inf 0x3f3f3f3f
#define MOD 1000000007
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define meminf(a) memset(a,inf,sizeof(a))
//vector ::iterator it;
//set<int>::iterator iter;
//fill(function+begin.,function+length,key);
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
//freopen("test.txt","r",stdin);
//freopen("output.txt","w",stdout);
int n,word[110]={0},id[110];
cin>>n;
for(int i=1;i<=n;i++)cin>>word[i];
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
fill(id+1,id+n+1,1);//身份数组初始化
id[i]=id[j]=-1;//标记两头狼
vector<int> v;//保存说谎者ID
for(int t=1;t<=n;t++)
{
if(word[t]*id[abs(word[t])]<0)
v.push_back(t);//保存说谎者编号
}
if(v.size()==2&&id[v[0]]+id[v[1]]==0)//说谎人数为2且一个是狼一个是民
{
cout<<i<<' '<<j<<endl;
return 0;
}
}
}
cout<<"No Solution"<<endl;
return 0;
}