题意是一堆人,从1到n编号,每个人i说一句话,x。x是正数表示i说x君是个好人,x是负数表示i说x君是坏人。问这个群体中最多能有多少好人,把这种情况用字典序的方式输出(好人用A表示,坏人用B表示),希望我把题意说清楚了。

又做了一道Hackerrank上一道很好玩的题目,做的时候怎么都想不出来。。。

但看完了题解之后,又发现这个题目。。。

其实这个思路以前做并查集的时候有过,就是每个人就两种可能,即每个点就两种状态,那就对每个点再增加一个点,i增加一个点,i+n。这两个点始终都是对立的关系,如果i是好人,那么i+n一定是坏人。当时也想到dfs了,就是想把这个类的人归到一起去,比方说i是好人,i说j是好人,j说k是好人,那么就会希望i、j、k搞到一起去。这个时候就发挥了增加这个点的作用了,i比如是好人,i说j是坏人,那这个意思也就是i说j+n是坏人,i和j+n要搞到一起去,我靠,和并查集的一些题一样啊。。。。

后面就是查各个集的人数,胜利即是正义,人多即是正义。

官方题解代码:

#pragma warning(disable:4996)
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
using namespace std; const int mx = 300003;
int n; int norma(int x)
{
if (x < 0)
return abs(x) + n;
else
return x;
} int inv(int x)
{
x = norma(x);
if (x > n)
return x - n;
else
return x + n;
} vector<int>g[2 * mx];
int kc[mx];
int color[mx];
int flag[mx]; void call(int u, int mar)
{
if (color[u])
return;
color[u] = mar;
if (u <= n)
kc[mar]++;
for (int i = 0; i < g[u].size(); i++)
{
int v = g[u][i];
call(v, mar);
}
} void addedge(int u, int v)
{
g[u].push_back(v);
} int main()
{
//freopen("i.txt", "r", stdin);
//freopen("o.txt", "w", stdout); int t, u, v, ass;
int invu, invt;
cin >> t; while (t--)
{
memset(kc, 0, sizeof(kc));
memset(color, 0, sizeof(color)); cin >> n;
for (int i = 1; i <= 2 * n + 1; i++)
{
g[i].clear();
}
for (int i = 1; i <= n; i++)
{
u = i; cin >> v;
v = norma(v); addedge(u, v);
addedge(v, u); invu = inv(u);
invt = inv(v); addedge(inv(u), inv(v));
addedge(inv(v), inv(u));
}
ass = 0;
for (int i = 1; i <= n * 2; i++)
{
if (!color[i])
{
ass++;
call(i, ass);
}
}
memset(flag, 0, sizeof(flag));
for (int i = 1; i <= n; i++)
{
u = i;
v = inv(i); u = color[u];
v = color[v]; if (!flag[u] && !flag[v])
{
if (kc[u] >= kc[v])//查数量,贪心,数量多的为好人
{
flag[u] = 1;
flag[v] = 2;
}
else
{
flag[u] = 2;
flag[v] = 1;
}
}
} for (int i = 1; i <= n; i++)
{
if (flag[color[i]] == 1)
cout << "A";
else
cout << "B";
}
cout << endl;
}
//system("pause");
return 0;
}

Zenefits CodeSprint:Knight or Knave的更多相关文章

  1. 一道简单的广搜题:Knight Moves

    这本来是要用双向宽度搜索的,但是我用简单的广搜也成功了,L<=300,也不会超时?? 另外一个问题就是,我本来想用原来的代码交,结果80分??将边界条件从小于L改成小于等于L,就对了.我可能不会 ...

  2. UVA Knight Moves

    题目例如以下: Knight Moves  A friend of you is doing research on the Traveling Knight Problem (TKP) where ...

  3. 利用beans.xml进行简单的Spring应用上下文创建与使用

    继上次配置Spring完成后,我们来创建一个简单的例程来理解Spring中利用beans.xml创建应用上下文的方法. 程序路径包为:com.spring.kinghts(kinght单词拼写错误,怕 ...

  4. 用PHP写的一个简单的分页类 1.0版

    <?php /* 分页类 用于实现对多条数据分页显示 version:1.0 author:Knight E-Mail:S.Knight.Work@gmail.com Date:2013-10- ...

  5. POJ 1915-Knight Moves (单向BFS &amp;&amp; 双向BFS 比)

    主题链接:Knight Moves 题意:8个方向的 马跳式走法 ,已知起点 和终点,求最短路 研究了一下双向BFS,不是非常难,和普通的BFS一样.双向BFS只是是从 起点和终点同一时候開始搜索,可 ...

  6. 记录----第一次使用BFS(广度搜索)学习经验总结

    学习经验记录与分享—— 最近在学习中接触到了一种解决最短路径的实用方法----BFS(广度搜索),在这里总结并分享一下第一次学习的经验. 首先第一个要了解的是"queue"(队列函 ...

  7. 【377】only one element in a tuple

    Recently I am doing the assignment of COMP9021. It is too difficult and it is about the Knight and K ...

  8. TZOJ 2755 国际象棋(广搜+哈希)

    描述 在n*n的国际象棋棋盘中,给定一“马(Knight)”和一“后(Queen)”的位置,问“马”能否在m步之内(包括m步)到达“后”的位置?马的走法是:每步棋先横走或直走一格,然后再斜走一格,即走 ...

  9. OPC测试常用的OPCClient和OPCServer软件推荐

    各位在进行OPC通讯时,常会遇到两种情况: 1)使用一个OPCClient在同一台计算机上连接远程计算机上的多个OPCServer时,发现某个OPCServer是通畅的,但其他的OPCServer却无 ...

随机推荐

  1. 使用python同时替换json多个指定key的value

    1.如何同时替换json多个指定key的value import json from jsonpath_ng import parse def join_paths(regx_path,new_val ...

  2. webstorm不能中文输入问题

    版本:2018.1.4 原因:http://www.javatang.com/archives/2017/08/27/52101751.html 解决方案:https://www.cnblogs.co ...

  3. Plastic Sprayers Manufacturer -Plastic Spray Bottle Product Features, Nozzle Properties

    Nowadays, plastic spray bottles are widely used in the plastic packaging industry. What are the char ...

  4. LeetCode 组合总和(dfs)

    题目 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重 ...

  5. AMD R7 2700X 安装虚拟机

    自己组装的台式机,选用的是微星X470主板,该主板默认的虚拟化技术是关闭的,在bios中也不太容易找到,具体方法如下. [开机或重启]--[按住DEL进入BIOS]--[高级模式F7]--[选择OC] ...

  6. 分享Linux系统快速入门法

    相信看到这篇文章的你一定是想要学习Linux,或者已经在学习Linux的人了,那我们就可以一起探讨一下,学习Linux如何快速入门呢? 首先,希望大家弄清楚自己为什么要学习Linux,有的人是因为兴趣 ...

  7. 如何隐藏php和apache头信息

    去掉 X-Powered-By 只需要修改php.ini 中 expose_php = On 改成expose_php = Off 隐藏 Apache 版本信息,修改/etc/httpd/conf/h ...

  8. H2知识小结

    1.官网: http://www.h2database.com/html/main.html file:///E:/Develop/H2/docs/html/tutorial.html#web_app ...

  9. 【C语言】创建一个函数,判断某一正整数是否为水仙花数,并调用这个函数找出1000以内所有水仙花数

    #include <stdio.h> int fun(int x) { int a, b, c; a = x / ; b = x % / ; c = x % ; if (x == a * ...

  10. JS-try/catch方法判断字符串是否为json格式

    定义: try/catch 语句用于处理代码中可能出现的错误信息,出现异常会导致程序崩溃,而try/catch 则可以保证程序的正常运行. try { //执行代码 不报错则 正常执行 不会进入下面的 ...