写在前面
- 参考思路
- 输入数字保存在v容器数组
- i从1~n、j从i+1~n遍历,分别假设i和j是狼人
- a数组表示该人是狼人还是好人,等于1表示是好人,等于-1表示是狼人。
- k从1~n分别判断k所说的话是真是假,
v[k] * a[abs(v[k])] < 0
- 说谎,则将k放在lie数组中
- 遍历完成后判断lie数组,如果说谎人数等于2并且这两个说谎的人1个好人1个狼人
a[lie[0]] + a[lie[1]] == 0
(即)表示满足题意,输出i和j并return - 否则最后的时候输出No Solution~
测试用例
input:
5
-2
+3
-4
+5
+4
output:
1 4
input:
6
+6
+3
+1
-5
-2
+4
output:
1 5
input:
5
-2
-3
-4
-5
-1
output:
ac代码
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> v(n+1);
for(int i=1; i<=n; i++)
cin >> v[i];
/* 假设i和j是狼人 */
for(int i=1; i<=n; i++)
{
for(int j=i+1; j<=n; j++)
{
/* a数组表示该人是狼人还是好人,等于1表示是好人,等于-1表示是狼人 */
vector<int> lie, a(n+1,1);
a[i] = a[j] = -1;
/* k从1~n分别判断k所说的话是真是假 */
for(int k=1; k<=n; k++)
if(v[k]*a[abs(v[k])]<0) lie.push_back(k);
/* 说谎人数等于2并且1个好人1个狼人,表示满足题意,输出i和j编号 */
if(lie.size()==2 && a[lie[0]] + a[lie[1]]== 0)
{
cout << i << " " << j;
return 0;
}
}
}
cout << "No Solution";
return 0;
}