下面的是从该网站上copy过来的,稍微改了一点,给出链接:http://hi.baidu.com/nondes/item/26dd0f1a02b1e0ef5f53b1c7

题意:有N个人玩剪刀石头布,其中有个人是裁判,其他人分为3组。 这3组中每个组分别出剪刀,石头和布。 裁判可以任意出3个中的一个。 现在有M个回合,每个回合从N个人中任意选出两个人来玩,并给出结果。 要求输出最早找出裁判的回合数,以及裁判的编号! 还有可能无法确定,或者不可能出现这种结果。

思路:利用并查集可以建立起相对关系,但是问题出在裁判可以任意出招,也就是说通过裁判建立起来的任何关系都是不可靠的。 所以不能通过裁判来建立任何关系。

  于是可以枚举裁判是哪一个,对有他参与的回合不予处理! 接下来就是如何确定他是不是裁判!

  假设当前某个人作为裁判,在他不参与的回合中出现了矛盾,那么这个人一定就不是裁判。

  1.如果存在着一个真实的裁判,那么枚举他的时候不会出现矛盾,而枚举其他人的时候一定会出现矛盾。

  2.如果有大于1个不出现任何矛盾的情况,则就是不能确定的!

  3.而对于所有枚举都出现矛盾的时候,即所有小孩都不是裁判,则这是不可能的。因为如果出现矛盾,那么其中至少有一个“临时”裁判,枚举到他的时候就应该不出现矛盾!

  怎么确定最早发现裁判的回合数:

  对每一轮枚举,发现矛盾最早时刻是error[i],那么确定裁判的回合数一定是max(error[i])。

  对于处理并查集的时候,可以通过记录一个val[i]表示他与父亲节点的关系:

   val[i]==0:表示他和父亲同组; val[i]==1:表示父亲所在的组能赢过他; val[i]==2:表示他能赢过父亲所在的组;

再附上从一个网站上看到的,自己修改了一点,后来找不到网址了,给出不了链接了。。。原作者原谅啊。。。

  其实这题跟食物链完全一个磨子,同样三类食物,同样的互相制约关系。但这题有个judge,他可以出任意手势。

  于是我们的做法是,枚举每个小孩为裁判,判断他为裁判时在第几句话出错error[i](即到第几句话能判断该小孩不是裁判)。

  1. 如果只有1个小孩是裁判时,全部语句都是正确的,说明该小孩是裁判,那么判断的句子数即为其他小孩的error[i]的最大值。

  2. 如果每个小孩为裁判时,都可以找到矛盾的语句,则他们都不是裁判,那么就是impossible。

  3. 多于1个小孩为裁判时,没有找到矛盾的语句,就是Can not determine。

至于为什么判断的句子数是其他小孩的error[i]的最大值max,因为至少需要max行语句,才能使得其他小孩“做裁判”时找出矛盾的语句。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>/*
AC  579ms
枚举+带权并查集,如何判断最后输出结果的时候比较难
*/
using namespace std;
const int maxn=510;
int n,m,num;//num为枚举完所有人后,其中不矛盾的个数(即有多少个人"做裁判"时,剩下的数据中没有出现矛盾)
int father[maxn];
int val[maxn]; //相对父节点的关系,平局:0,输:1(输给父节点),赢:2(赢了父节点)
int error[maxn];//error[i]表示枚举i做裁判时,矛盾出现在第几行
char str[2010][20];struct Node{int a,b,c;  //a<b,a>b,a=b,c存储的是b相对a的关系:平局:0,输:1,赢:2
}node[2010];void init(){for(int i=0;i<maxn;i++){father[i]=i;val[i]=0;}
}int find_root(int x){if(father[x]==x)return x;int tmp=father[x];father[x]=find_root(father[x]);val[x]=(val[x]+val[tmp])%3;return father[x];
}void Union(int x,int y,int fx,int fy,int c){father[fy]=fx;val[fy]=(3-val[y]+c+val[x])%3;
}
//求每次询问时的a,b,c的值,存入node数组中
void abc(int j){node[j].a=node[j].b=node[j].c=0;int len=strlen(str[j]),i;for(i=0;i<len;i++){if(str[j][i]=='<'){node[j].c=2;break;}else if(str[j][i]=='>'){node[j].c=1;break;}//额,原本就直接写了个else。。。else if(str[j][i]=='='){node[j].c=0;break;}}for(int k=0;k<i;k++){node[j].a*=10;node[j].a+=str[j][k]-48;}for(int k=i+1;k<len;k++){node[j].b*=10;node[j].b+=str[j][k]-48;}
}
int main()
{int a,b,c;int ans,round; //ans存储裁判的编号,round存储在第几行可判断出裁判while(scanf("%d%d",&n,&m)!=EOF){init();memset(error,0,sizeof(error));num=0;round=0;for(int i=1;i<=m;i++){scanf("%s",str[i]);abc(i);}
/*
我知道原本错哪里了啊,小孩的编号不仅仅只有一位数。。。如12<13,100<101。。。
*/for(int i=0;i<n;i++){init(); //每次枚举之前都要初始化。。。for(int j=1;j<=m;j++){a=node[j].a;b=node[j].b;c=node[j].c;if(a==i || b==i)continue;int fa=find_root(a);int fb=find_root(b);if(fa==fb){int t=(val[b]+3-val[a])%3;if(t!=c){error[i]=j;break;}}else{Union(a,b,fa,fb,c);}}}for(int i=0;i<n;i++){round=max(round,error[i]);if(error[i]==0){ans=i;num++;}}//只有一个小孩,当他作为裁判时,全部语句都正确,则他为裁判if(num==1){printf("Player %d can be determined to be the judge after %d lines\n",ans,round);}//当有多个小孩,当他作为裁判时,全部语句都正确,则无法确定else if(num>1){printf("Can not determine\n");}//所有小孩作为裁判时,语句都有矛盾的地方,即他们都不是裁判,显然不可能else{printf("Impossible\n");}}return 0;
}

转载于:https://www.cnblogs.com/chenxiwenruo/p/3319009.html

POJ 2912 Rochambeau(难,好题,枚举+带权并查集)相关推荐

  1. 【POJ - 1703】Find them, Catch them(带权并查集之--种类并查集 权为与父节点关系)

    题干: Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 36176   Accep ...

  2. POJ 1182 食物链 [并查集 带权并查集 开拓思路]

    传送门 P - 食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit  ...

  3. poj1182 and 携程预赛2第一题 带权并查集

    题意:       动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A.  现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底 ...

  4. Valentine's Day Round hdu 5176 The Experience of Love [好题 带权并查集 unsigned long long]

    传送门 The Experience of Love Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Ja ...

  5. 2017 西安网络赛A Tree(树上静态查询,带权并查集,矩阵乘法压位,好题)

    题目链接 题意: 给出 \(n(n \leq 3000)\) 个结点的一棵树,树上每个结点有一个 \(64 \times 64\) 的 \(0,1\)矩阵,每个结点上的矩阵是根据输入的 \(seed\ ...

  6. POJ 1984 Navigation Nightmare 【经典带权并查集】

    任意门:http://poj.org/problem?id=1984 Navigation Nightmare Time Limit: 2000MS   Memory Limit: 30000K To ...

  7. How Many Answers Are Wrong HDU - 3038(带权并查集经典题,满满的都是注释)

    How Many Answers Are Wrong HDU - 3038  点击打开链接 题意:现在有n个数(你并不知道这n个数是什么),m次查询,每次查询给出u,v,w.表示从第u个数到第v个数的 ...

  8. 2015 UESTC 数据结构专题H题 秋实大哥打游戏 带权并查集

    秋实大哥打游戏 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 Descr ...

  9. POJ 2492 A Bug's Life 带权并查集

    题意: 思路: mod2 意义下的带权并查集 如果两只虫子是异性恋,它们的距离应该是1. 如果两只虫子相恋且距离为零,则它们是同性恋. (出题人好猥琐啊) 注意: 不能输入一半就break出来.... ...

最新文章

  1. 理解 Delphi 的类(十) - 深入方法[23] - 重载
  2. 数据资源 | ​社会科学数据资源
  3. 新网 云服务器,新网云服务器的优势包括什么?
  4. python编写赛车游戏单机版_使用Keras和DDPG玩赛车游戏(自动驾驶)
  5. 利用SoapUI 测试web service的一些问题总结
  6. Java集合篇:ConcurrentHashMap详解(JDK1.8)
  7. matlab 图像显著性检测ft_全局对比度的图像显著性检测算法
  8. phpMyFAQ 3.0.3 中文版
  9. 【BZOJ3158】千钧一发,网络流之最大权闭合子图
  10. 【安装配置】克隆方式安装Oracle数据库软件
  11. Membership三步曲之入门篇 - Membership基础示例
  12. WebView 的新增安全功能
  13. 微信小程序 云开发 和 传统服务器 对比 区别
  14. Centos7安装java运行环境
  15. 信号分析与处理 基于matlab认识实验
  16. win10家庭版的常见问题1
  17. 【verbs】ibv_query_port()
  18. Spring Boot打包成执行jar后获取classpath下文件异常解决
  19. 全面解析软文营销中的八大技巧
  20. Unity中使用Post Processing 开自发光效果

热门文章

  1. centos安装python3.5_CentOS 7安装Python3.5
  2. JDBC操作(基础篇)
  3. java机器PDF_机器人制作入门(第3版)PDF 下载
  4. python获取当前网页元素_python – 如何获取webdriver中元素的当前内容
  5. java中el是什么_java中jsp的EL的定义以及使用
  6. android内存占用分析,Android App性能评测分析-内存篇
  7. python连接oracle报错tns_Python3操作oracle数据库及遇到的报错
  8. can test 接收报文_获取CAN报文并解析
  9. 与nfs相关的计算机服务设置,在服务器端配置nfs
  10. 计算机教师自检自查报告,信息技术教学工作自查报告