博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Zenefits CodeSprint:Knight or Knave
阅读量:6259 次
发布时间:2019-06-22

本文共 2050 字,大约阅读时间需要 6 分钟。

题意是一堆人,从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 
#include
#include
#include
#include
#include
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
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;}

转载于:https://www.cnblogs.com/lightspeedsmallson/p/5173958.html

你可能感兴趣的文章
apk反编译步骤
查看>>
自己做的笔试题
查看>>
SCVMM Self-Service Portal 2.0 SP1安装体验
查看>>
Hive自定义UDF和聚合函数UDAF
查看>>
lzg_ad:使用Virtual PC 部署和测试XP Embedded 发布镜像
查看>>
关于ssh 配置文件的参数说明
查看>>
金山词霸2005无法用鼠标取词
查看>>
Java Http断点下载文件
查看>>
我的微软最有价值专家(Microsoft MVP)之路
查看>>
如何在gcc编译时指定共享库的搜索路径?
查看>>
如何安装和配置 Rex-Ray?- 每天5分钟玩转 Docker 容器技术(74)
查看>>
Linux下SENDMAIL+OPENWEBMAIL(1)
查看>>
无法添加内核模式驱动的打印机
查看>>
Spring Cloud规范实战
查看>>
javascript event 事件
查看>>
2012自学CCNP路由与交换之三网络设备造型及验收
查看>>
lf4j+logback配置方式,logback.groovy使用备忘
查看>>
RHEL,centOS下vncserver,service命令关联的rpm包
查看>>
slf4j+logback配置方式,logback.groovy使用备忘
查看>>
android中阿拉伯文研究
查看>>