Rochambeau

Time Limit: 5000MS   Memory Limit: 65536K
Total Submissions: 5208   Accepted: 1778

题目链接http://poj.org/problem?id=2912

Description:

N children are playing Rochambeau (scissors-rock-cloth) game with you. One of them is the judge. The rest children are divided into three groups (it is possible that some group is empty). You don’t know who is the judge, or how the children are grouped. Then the children start playing Rochambeau game for M rounds. Each round two children are arbitrarily selected to play Rochambeau for one once, and you will be told the outcome while not knowing which gesture the children presented. It is known that the children in the same group would present the same gesture (hence, two children in the same group always get draw when playing) and different groups for different gestures. The judge would present gesture randomly each time, hence no one knows what gesture the judge would present. Can you guess who is the judge after after the game ends? If you can, after how many rounds can you find out the judge at the earliest?

Input:

Input contains multiple test cases. Each test case starts with two integers N and M (1 ≤ N ≤ 500, 0 ≤ M ≤ 2,000) in one line, which are the number of children and the number of rounds. Following are M lines, each line contains two integers in [0, N) separated by one symbol. The two integers are the IDs of the two children selected to play Rochambeau for this round. The symbol may be “=”, “>” or “<”, referring to a draw, that first child wins and that second child wins respectively.

Output:

There is only one line for each test case. If the judge can be found, print the ID of the judge, and the least number of rounds after which the judge can be uniquely determined. If the judge can not be found, or the outcomes of the M rounds of game are inconsistent, print the corresponding message.

Sample Input:
3 3
0<1
1<2
2<0
3 5
0<1
0>1
1<2
1>2
0<2
4 4
0<1
0>1
2<3
2>3
1 0

Sample Output:
Can not determine
Player 1 can be determined to be the judge after 4 lines
Impossible
Player 0 can be determined to be the judge after 0 lines

题意:

n个小朋友被分为三组玩剪刀石头布,每一组的小朋友只出固定的招数,但是这些小朋友里面有个裁判,他可以任意出,现在问是否能够确定出这个裁判,最少经过几轮?

题解:

三个组并且是个关于输赢的环状关系,所以我们可以思考带权并查集,v[x]代表x与其父亲结点的关系,v[x]=0代表同类,v[x]=1代表x赢他父亲,v[x]=2就代表输了。

现在关键是这个裁判,我们通过思考可以发现,假如确定了这个人为裁判,那么他参与的几次都不算做分组。

但如何去确定就是个问题。注意这题时间限制挺大的,所以我们直接枚举,假定每个人都作为裁判就行了。

最后还要确定经过几轮游戏,这里挺有意思的:

确定目前这个人为裁判,这等价于排除其他所有人不是裁判的最少次数,这个在枚举其他人作为裁判时就可以进行处理了。

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std; const int N = ;
int n,m;
int f[N],a[N],b[N],v[N],ans[N];
char c[N]; int find(int x){
if(x==f[x]) return x;
int tmp=f[x];
f[x]=find(f[x]);
v[x]=(v[x]+v[tmp])%;
return f[x];
} int main(){
while(~scanf("%d%d",&n,&m)){
for(int i=;i<=m;i++) scanf("%d%c%d",&a[i],&c[i],&b[i]);
int tot = ,cnt = ,l = ;
memset(ans,,sizeof(ans));
for(int i=;i<n;i++){
bool flag=true;cnt=;
for(int j=;j<=n;j++) f[j]=j,v[j]=;
for(int j=;j<=m;j++){
if(a[j]==i || b[j]==i) continue;
int fx=find(a[j]),fy=find(b[j]);
if(c[j]=='>'){
if(fx==fy && (v[a[j]]+-v[b[j]])%!=) flag=false,cnt=j;
else{
f[fx]=fy;
v[fx]=(-v[a[j]]++v[b[j]])%;
}
}else if(c[j]=='<'){
if(fx==fy && (v[a[j]]+-v[b[j]])%!=) flag=false,cnt=j;
else{
f[fx]=fy;
v[fx]=(-v[a[j]]++v[b[j]])%;
}
}else{
if(fx==fy && (v[a[j]]+-v[b[j]])%!=) flag=false,cnt=j;
else{
f[fx]=fy;
v[fx]=(-v[a[j]]+v[b[j]])%;
}
}
if(!flag) break;
}
if(flag) ans[++tot]=i;
l=max(l,cnt);
}
if(tot==) puts("Impossible");
else if(tot>) puts("Can not determine");
else printf("Player %d can be determined to be the judge after %d lines\n",ans[],l);
}
return ;
}

POJ2912:Rochambeau(带权并查集)的更多相关文章

  1. POJ - 2912 Rochambeau (带权并查集+枚举)

    题意:有N个人被分为了三组,其中有一个人是开了挂的.同组的人的关系是‘=’,不同组的人关系是‘<’或'>',但是开了挂的人可以给出自己和他人任意的关系.现在要根据M条关系找出这个开了挂的人 ...

  2. poj2912(带权并查集+枚举)

    题目链接:http://poj.org/problem?id=2912 题意:给n个人,m组关系,玩石头剪刀布的游戏,n个人中除一个人judge以外,其他人属于3个group(即石头.剪刀.布),他们 ...

  3. POJ 2912 Rochambeau(难,好题,枚举+带权并查集)

    下面的是从该网站上copy过来的,稍微改了一点,给出链接:http://hi.baidu.com/nondes/item/26dd0f1a02b1e0ef5f53b1c7 题意:有N个人玩剪刀石头布, ...

  4. [poj 2912] Rochambeau 解题报告 (带权并查集)

    题目链接:http://poj.org/problem?id=2912 题目: 题目大意: n个人进行m轮剪刀石头布游戏(0<n<=500,0<=m<=2000) 接下来m行形 ...

  5. POJ 1703 Find them, Catch them(带权并查集)

    传送门 Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 42463   Accep ...

  6. [NOIP摸你赛]Hzwer的陨石(带权并查集)

    题目描述: 经过不懈的努力,Hzwer召唤了很多陨石.已知Hzwer的地图上共有n个区域,且一开始的时候第i个陨石掉在了第i个区域.有电力喷射背包的ndsf很自豪,他认为搬陨石很容易,所以他将一些区域 ...

  7. poj1417 带权并查集 + 背包 + 记录路径

    True Liars Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2713   Accepted: 868 Descrip ...

  8. poj1984 带权并查集(向量处理)

    Navigation Nightmare Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 5939   Accepted: 2 ...

  9. 【BZOJ-4690】Never Wait For Weights 带权并查集

    4690: Never Wait for Weights Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 88  Solved: 41[Submit][ ...

随机推荐

  1. (译)JavaScript 中的正则表达式(RegEx)实操——快速掌握正则表达式,伴有随手可练的例子————(翻译未完待续)

    (原文:https://blog.bitsrc.io/a-beginners-guide-to-regular-expressions-regex-in-javascript-9c58feb27eb4 ...

  2. R语言学习笔记(十):零碎知识点(21-25)

    21--assign() assign函数可以通过变量名的字符串来赋值 > assign('a', 1:3) > a [1] 1 2 3 > b <- c('a') > ...

  3. 分支push不上去的问题

    还原一下现场,我在自己的项目里面,从master里面checkout的一个分支,当我在我这个分支里面进行 push代码的操作,我突然发现我的代码不能执行push的操作,如图 这个原因是由于远端的仓库没 ...

  4. C++基础语言知识大汇总(不断更新!!!)

    经过十天的时间,LITTLESUN做好了前期的工作,今天LITTLESUN就要在新地图里扬帆起航喽!!!(撒花) 简单的整理了一下这次启航准备好的物资.后面的航程中也会不断来补充这个小仓库哦!

  5. 用命令部署WebPart

    Webpart一般是一个wsp文件,可以在VS里面通过右键来部署.但一般真正的生产服务器上面是不会安装VS的,所以一般情况下是把wsp文件拷贝到服务器上面然后启动PowerShell用命令来部署. 部 ...

  6. Ubuntu16.04安装Zabbix

    基于Zabbix+MySQL+Apache(可选) apt-get install php7.0-bcmath php7.0-xml php7.0-mbstring安装Zabbix所需的几个PHP模块 ...

  7. 牛客网暑期ACM多校训练营(第七场):J-Sudoku Subrectangles

    链接:J-Sudoku Subrectangles 题意:给出 n * m 的字母矩阵,公52种字母.求出不含重复元素的子矩阵的个数. 题解: L[i][j]:s[i][j] ~ s[i][ j - ...

  8. 剑指offer-数值的整数次方12

    class Solution: def Power(self, base, exponent): # write code here if base==0: return 0 if exponent= ...

  9. truffle的调用nodeJs的问题

    Truffle3.0集成NodeJS并完全跑通(附详细实例,可能的错误) 升级到Truffle3.0 如果之前安装的是Truffle2.0版本,需要主动升级到Truffle3.0,两者的语法变化有点大 ...

  10. (转载)Linux进程间通信

    (在学习linux进程通信,看到一篇很好的文章,转载过来,原文地址是http://www.cnblogs.com/linshui91/archive/2010/09/29/1838770.html) ...