Zenefits CodeSprint:Knight or Knave
题意是一堆人,从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的更多相关文章
- 一道简单的广搜题:Knight Moves
这本来是要用双向宽度搜索的,但是我用简单的广搜也成功了,L<=300,也不会超时?? 另外一个问题就是,我本来想用原来的代码交,结果80分??将边界条件从小于L改成小于等于L,就对了.我可能不会 ...
- UVA Knight Moves
题目例如以下: Knight Moves A friend of you is doing research on the Traveling Knight Problem (TKP) where ...
- 利用beans.xml进行简单的Spring应用上下文创建与使用
继上次配置Spring完成后,我们来创建一个简单的例程来理解Spring中利用beans.xml创建应用上下文的方法. 程序路径包为:com.spring.kinghts(kinght单词拼写错误,怕 ...
- 用PHP写的一个简单的分页类 1.0版
<?php /* 分页类 用于实现对多条数据分页显示 version:1.0 author:Knight E-Mail:S.Knight.Work@gmail.com Date:2013-10- ...
- POJ 1915-Knight Moves (单向BFS && 双向BFS 比)
主题链接:Knight Moves 题意:8个方向的 马跳式走法 ,已知起点 和终点,求最短路 研究了一下双向BFS,不是非常难,和普通的BFS一样.双向BFS只是是从 起点和终点同一时候開始搜索,可 ...
- 记录----第一次使用BFS(广度搜索)学习经验总结
学习经验记录与分享—— 最近在学习中接触到了一种解决最短路径的实用方法----BFS(广度搜索),在这里总结并分享一下第一次学习的经验. 首先第一个要了解的是"queue"(队列函 ...
- 【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 ...
- TZOJ 2755 国际象棋(广搜+哈希)
描述 在n*n的国际象棋棋盘中,给定一“马(Knight)”和一“后(Queen)”的位置,问“马”能否在m步之内(包括m步)到达“后”的位置?马的走法是:每步棋先横走或直走一格,然后再斜走一格,即走 ...
- OPC测试常用的OPCClient和OPCServer软件推荐
各位在进行OPC通讯时,常会遇到两种情况: 1)使用一个OPCClient在同一台计算机上连接远程计算机上的多个OPCServer时,发现某个OPCServer是通畅的,但其他的OPCServer却无 ...
随机推荐
- javacript onclick事件中传递参数
var user = {id:1, name:'zhangsan'}; var object = '<a onclick="conversion(' + JSON.stringify( ...
- async+队列queue.Queue()
import queue import time import random import threading import asyncio import logging logging.basicC ...
- HashMap知识初探
public class TestHashMap { /** * HashMap是数组和链表组合构成的数据结构 * 数组里面每个地方都存了key-value这样的实例Java7叫Entry,Java8 ...
- ASP.NET Core搭建多层网站架构【0-前言】
2020/01/26, ASP.NET Core 3.1, VS2019 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构 目录 0-前言 1-项目结构分层建立 2-公共基 ...
- Travis CI Build Continuous Integration
什么是持续集成 持续集成(Continuous Integration)是经常合并小的代码更改的实践,而不是在开发周期结束时合并大的更改.目的是通过以较小的增量开发和测试来构建更健康的软件.这就是Tr ...
- 【MySQL】数据类型之字符相关
" 目录 字符类型 char类型 varchar类型 实测 总结 枚举类型与集合类型 字符类型 官网:https://dev.mysql.com/doc/refman/5.7/en/char ...
- 自己实现java中Iterator(迭代器功能)
今天躺在床上忽然想到一个问题,迭代器的代码是如何实现的?于是乎不由自主的爬起来敲两行代码. List<String> list=new ArrayList<>(2); list ...
- cnpm - 解决 " cnpm : 无法加载文件 C:\Users\93457\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本。有关详细信息 。。。 "
1.在win10 系统中搜索框 输入 Windos PowerShell选择 管理员身份运行 2,打开了powershell命令行之后,输入 set-ExecutionPolicy RemoteSig ...
- ubuntu 18.04中nginx不能访问软链接目录中的内容
解决办法:以root权限运行nginx,即修改/etc/nginx/nginx.conf中的user www-data为root
- package.json中的script选项作用
npm不仅可以用于模块管理,还可以用于执行脚本.package.json文件有一个scripts字段,可以用于指定脚本命令,供npm直接调用. 接下来做个简单测试: (1)在项目根目录下创建demo. ...