题目链接:PAT【甲级】1148
题目简述:“狼人杀”简单版。给定一个正整数N
,表示玩家人数。然后下面输入N
个整数Ni(1<=i<=N)
,每个位置i(1<=i<=N)
的数字,表示的意义是:第i个玩家认为第abs(Ni)
玩家是狼或者人(因为Ni可正可负,为正表示人,为负表示狼)。现已知只有两匹狼,且有两个玩家说谎,且为一个狼和一个人。
#include<bits/stdc++.h>
using namespace std;
int main(){
int N;
cin >> N;
vector<int> v(N + 1);
bool isGetAns = false;
for (int i = 1; i <= N;i++)
cin >> v[i];
for (int i = 1; i <= N - 1;i++){
for (int j = i + 1; j <= N;j++){
vector<int> lie;
vector<int> type(N + 1, 1);
type[i] = type[j] = -1;
for (int k = 1; k <= N;k++){
if(v[k] * type[abs(v[k])] < 0)
lie.push_back(k);
}
if(lie.size() == 2 && type[lie[0]] + type[lie[1]] == 0){
cout << i << " " << j;
return 0;
}
}
}
cout << "No Solution";
return 0;
}
这题充分反映出自己的思路和逻辑不太行。可以看到代码很简单,但是的确是被唬住了。
看到题意只有两头狼,应该想到去枚举这两头狼(从小到大,这样还能按题意输出)看那种情况符合输出就行,可是说谎怎么处理。说谎的人只有两个,一个是人,一个是狼,这一点很重要。如果我们去枚举两头狼时,再去枚举判断谁说了谎,自然应该是能实现的,但是这太过繁琐。
由于狼确定了(我们事先枚举假设,已经确定了),人自然也能确定。那我们不就知道谁说了谎吗?因为每个人会指出一个玩家是狼还是人,那自然我们这是就能判断谁说了谎。这是把说谎的玩家记录下来,看看是不是只有两个人,是不是满足题目要求一个狼玩家一个人玩家?
很流畅清晰的思路。所以感觉遇到这种题目不要慌,毕竟是放在前面的,动动脑子转化题意,转化题意很重要,一定就能够想的出来。