POJ 2912 Rochambeau
题意:有一些人玩石头剪刀布,其中有一个人(称其为裁判)可以出“石头”,“剪刀”,“布”中的任意一个,其他人永远只能出相同的一个。即有的人只能出剪刀,有的人只能出石头,有的人只能出布。进行了多次对决,每次只告诉你谁赢了(或者平手),不说谁出了什么。问能否判断出谁是裁判,裁判有多少个?若只有一个裁判,问在进行了多少次对决以后就能判断出裁判是谁。
解法:首先,判断出裁判的方法是,若1,2,3号选手的结果出现了矛盾,则1,2,3号中必有一个人是裁判,
(1)这个时候如果3,4号的对决结果出现矛盾,则判定3为裁判,然后还需要验证(即如果3为裁判,其他对决结果是不是不会有矛盾);
(2)这个时候如果4,5号出现矛盾,则说明裁判不止一个人,与题设不符;
(3)如果之后都再也没有出现矛盾,则说明不能判断出裁判是谁。
所以,方法就是,枚举谁是裁判,判断是否所有不涉及到裁判的对决结果之间没有矛盾。如果只有一个裁判,还需要求进行了多少次对决以后就已经能判断出裁判是谁了。由以上结论不难看出,在整个枚举过程中,最大的出现矛盾的对决的编号数即为所求。
tag:并查集,good
/*
* Author: Plumrain
* Created Time: 2013-11-28 19:23
* File Name: DS-POJ-2912.cpp
*/
#include <iostream>
#include <cstdio>
#include <vector> using namespace std; #define PB push_back struct node{
int f, r;
}; int n, m, line;
node p[];
char xn[];
vector<int> ans;
int an[], bn[]; int find (int x)
{
if (x != p[x].f){
int y = p[x].f;
p[x].f = find(y);
p[x].r = (p[x].r + p[y].r) % ;
}
return p[x].f;
} void merge(int a, int b, char xx, int t1, int t2)
{
int x;
if (xx == '=') x = ;
else if (xx == '>') x = ;
else x = ; p[t1].f = t2;
p[t1].r = ( - p[a].r + x + p[b].r) % ;
} bool ok(int a, int b, char xx)
{
int x;
if (xx == '=') x = ;
else if (xx == '>') x = ;
else x = ; return x == ((p[a].r + - p[b].r) % );
} bool gao(int x)
{
for (int i = ; i < n; ++ i){
p[i].f = i;
p[i].r = ;
} for (int i = ; i < m; ++ i){
if (an[i] == x || bn[i] == x) continue; int t1 = find(an[i]), t2 = find(bn[i]);
if (t1 != t2)
merge(an[i], bn[i], xn[i], t1, t2);
if (t1 == t2)
if (!ok(an[i], bn[i], xn[i])){
line = max(line, i + );
return ;
}
}
return ;
} int main()
{
while (scanf ("%d%d", &n, &m) != EOF){
if (!m){
if (n == ) printf ("Player 0 can be determined to be the judge after 0 lines\n");
else printf ("Can not determine\n");
continue;
} for (int i = ; i < m; ++ i)
scanf ("%d%c%d", &an[i], &xn[i], &bn[i]); ans.clear();
line = ;
for (int i = ; i < n; ++ i)
if (gao(i)) ans.PB (i); int sz = ans.size();
if (sz > ) printf ("Can not determine\n");
else if (!sz) printf ("Impossible\n");
else printf ("Player %d can be determined to be the judge after %d lines\n", ans[], line);
}
return ;
}
POJ 2912 Rochambeau的更多相关文章
- POJ 2912 - Rochambeau - [暴力枚举+带权并查集]
题目链接:http://poj.org/problem?id=2912 Time Limit: 5000MS Memory Limit: 65536K Description N children a ...
- POJ 2912 Rochambeau(种类并查集+枚举)
题目链接:http://poj.org/problem?id=2912 题目大意:n个人玩,玩石头剪刀布游戏,其中1人是裁判,剩下的n-1个人分为3组, 他们商量好了,相同组的人每次都出相同的手势,不 ...
- [poj 2912] Rochambeau 解题报告 (带权并查集)
题目链接:http://poj.org/problem?id=2912 题目: 题目大意: n个人进行m轮剪刀石头布游戏(0<n<=500,0<=m<=2000) 接下来m行形 ...
- poj 2912 Rochambeau(枚举+带权并查集)
题目链接:http://poj.org/problem?id=2912 题意:多个人玩石头剪刀布分成3组和一个裁判,每一组提前选定了自己出哪个手势,裁判可以随意出什么手势,问是否能够从给出的一系列石头 ...
- POJ 2912 Rochambeau(难,好题,枚举+带权并查集)
下面的是从该网站上copy过来的,稍微改了一点,给出链接:http://hi.baidu.com/nondes/item/26dd0f1a02b1e0ef5f53b1c7 题意:有N个人玩剪刀石头布, ...
- POJ - 2912 Rochambeau 种类并查集
题意:有三组小朋友在玩石头剪刀布,同一组的小朋友出的手势是一样的.这些小朋友中有一个是裁判,他可以随便出手势.现在给定一些小朋友的关系,问能否判断出裁判,如果能最早什么时候能够找到裁判. 思路:枚举每 ...
- POJ 2912 Rochambeau(暴力)+【带权并查集】
<题目链接> 题目大意: n个人进行m轮剪刀石头布游戏(0<n<=500,0<=m<=2000),接下来m行形如x, y, ch的输入,ch='='表示x, y平局 ...
- POJ - 2912 Rochambeau (带权并查集+枚举)
题意:有N个人被分为了三组,其中有一个人是开了挂的.同组的人的关系是‘=’,不同组的人关系是‘<’或'>',但是开了挂的人可以给出自己和他人任意的关系.现在要根据M条关系找出这个开了挂的人 ...
- 【35.53%】【POJ 2912】Rochambeau
Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 2837 Accepted: 1008 Description N childre ...
随机推荐
- 补充一下sql server(临时表)
说明:(1).临时表其实是放在数据库tempdb里的一个用户表:(2).TempTableName必须带“#”,“#"可以是一个或者两个,以#(局部)或##(全局)开头的表,这种表在会话期间 ...
- JS调用android逻辑方法
1.安卓打开webview时做如下配置 并做一回调接口 这里注意的是 参数 FULIBANG 和 回调接口方法 jsCallWebView 一会在JS里会用到 ================= ...
- C# string转int
1,int转成string用toString 或者Convert.toString()如下 例如:int varInt = 1; string varString = Convert.ToString ...
- hbase的存储体系
一.了解hbase的存储体系. hbase的存储体系核心的有Split机制,Flush机制和Compact机制. 1.split机制 每一个hbase的table表在刚刚开始的时候,只有一个regio ...
- VC++读取资源中文件
//查找目标资源 HRSRC hResource = FindResource(GetModuleHandle(NULL), MAKEINTRESOURCE(IDR_MAINPROG), TEXT(& ...
- js编译和执行顺序
JS是一段一段执行的(以<script>标签来分割),执行每一段之前,都有一个“预编译”,预编译干的活是:声明所有var变量(初始为undefined),解析定义式函数语句. 还有个关于 ...
- Java学习----this和super(在继承中)
public class Base { /*public Base() { System.out.println("Base 类的初始构造方法"); }*/ public Base ...
- js获取url中的参数对象、js生成带参数的url
// 获取url中的参数,并返回一个对象 $.getRequestData = function() { var url = location.search; //获取url中"?" ...
- JQuery jsonp使用小记
在一个不支持PHP的主机上,需要对某些页面做访问统计.我的方案是在静态的HTML页面上,用JSONP向能够执行PHP的主机进行跨域请求,从而使用PHP解决这个访问量统计问题. 在服务器端,PHP页面返 ...
- 51中的C语言数据类型
在标准C语言中基本的数据类型为char,int,short,long,float 和double,而在C51编译器中int和short相同,float和double相同. 说明: (1)类型修饰符si ...