ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1089 狼人杀-简单版 (20 point(s))

2021-09-21 21:02:06  阅读:170  来源: 互联网

标签:20 变量 point int 假设 代码 狼人 说谎者


  • 最开始想通过样例给出的好人和狼的结果,结合输入找到其中的规律。但是找了半天没发现什么规律。

    后面又看了看题干的条件, “有狼人撒谎但并不是所有狼人都在撒谎” 所以想是不是分别假设说话人,说狼的部分和说好人的部分有一个是错的,其他是对的,结合其他说话的序号,将本次好人和狼的结果的序号存起来。下一次循环再对另一个人假设的说谎而其他人说实话,继续将保存结果。如此将说狼的和说好人的分别都假设说谎一次,以排列组合的方式得到不同的结果并存起来。

    但是得到了这样的结果有什么用,当时没有想出来。最后因为想的时间太久而没进一步思路,就看别人的代码和分析了。

  • 看了别人的分析后,才明白原来题目给出的二狼二说谎是有解的条件,就跟前几题的代数关系一样,只不过这里有解的条件是统计对象的个数。当时没有注意这点。

    而明确了求解条件后,只需要根据条件找出狼和说谎者,之后判断是否满足条件,如果遍历完都没满足则无解。

    • 而看了参考代码4对应题干的分析,发现题干的说明其实给足了解题的思路。

      要求你找出扮演狼人角色的是哪几号玩家?

      已知 N 名玩家中有 2 人扮演狼人角色

      for (int i = 1; i <= n; i++) 
      	 for (int j = i + 1; j <= n; j++)
      

      第一句话可以暗示我们应该设变量来标志狼,第二句话则强调我们应该设两个变量来表示狼。

      有 2 人说的不是实话

      有狼人撒谎但并不是所有狼人都在撒谎

      if (lie.size() == 2 && a[lie[0]] + a[lie[1]] == 0)

      这两句话对应有解条件的判断代码。

    • 而明确了思路我们现在可以假设变量表示狼,为了满足条件还应该思考如何找到说谎者。

      而说谎成立的条件是说话者所说的对象的身份和这对象的真实身份是否相符。身份不一致说明说话者在说谎。

      既然我们假设了狼,那么也意味着其他人非狼者是好人,这样我们得到了各对象身份的假设,再于实际各对象所说的话对比,即可得到说谎者的人数以及是否满足一狼一好人。成立则有解,结束程序。反之无解。

      v[k] * a[abs(v[k])

      参照输出样例的结果来解释下实际处理的话,结果表明1号是狼,那么假设我们现在 -1 狼 +1 好人 有 1:-1 2:+1 3:+1 4:-1 5:+1 。那么1号说 v[1]=-2 二号是狼,但在我们假设的身份中 a[abs[v[k]]]=+1 2号是好人。这便意味着1号说了谎,可以将其拉入说谎者的行列。

  • 理解了题干和解题思路后,可以看到原本企图从输入输出样例找规律,以及假设说谎者的思路错误的原因仍然在于没有看出题目暗示的解题方向。

    比如上面标注的两狼,和找狼的描述,实际上暗示了代码中应该设立变量表示狼,并且需要两个变量进行表示。

    所以正确理解题目,并用代码和变量对其进行表示是很重要。就像解数学题或者物理题的时候,让你设未知量来描述题干对象,并根据条件来构建变量关系,建立等式。而写代码题则是将题目对象翻译成变量,将条件用代码来表示。

    参考代码1

    参考代码2

    参考代码3

    参考代码4

#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];
    for (int i = 1; i <= n; i++) {
        for (int j = i + 1; j <= n; j++) {
            vector<int> lie, a(n + 1, 1);
            a[i] = a[j] = -1;
            for (int k = 1; k <= n; k++)
                if (v[k] * a[abs(v[k])] < 0) lie.push_back(k);
            if (lie.size() == 2 && a[lie[0]] + a[lie[1]] == 0) {
                cout << i << " " << j;
                return 0;
            }
        }
    }
    cout << "No Solution";
    return 0;
}

标签:20,变量,point,int,假设,代码,狼人,说谎者
来源: https://www.cnblogs.com/Atl212/p/15317793.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有