258. 石头剪子布

题目传送门

题意挺好理解,但是当我看样例的时候就傻了。不是说好的只有一个裁判的吗?出现矛盾的时候该怎么判定裁判?

分析

观察这个数据量就会发觉是有猫腻的,直接从正面求出裁判并不是很容易,那么直接枚举裁判呢?由于裁判是可以随便出的,那么把它从所有对局中除去后理应没有矛盾才对。所以就有了如下做法

  • 枚举裁判,从前往后遍历对局,按照并查集例题食物链的做法去处理就行。可能遇到的情况有下面两种

    1. 直到发现第一个矛盾,那么当前枚举的这个人就不应该是裁判。然后把当前对局标号记录下来,表示最早到该对局时可以发现裁判并不是当前枚举的这个人

    2. 从头到尾没有矛盾,那么这个人可能就是裁判,答案结果数+1

  • 如果答案结果数大于1,表示可能的裁判有很多种,输出 Can not determine

  • 如果答案结果数为1,要输出排除其他所有不可能是裁判的人最小的对局号

  • 如果答案结果数为0,表示没有裁判,输出 Impossible

const int N = 505;
const int M = 2020;
struct node{
int a,b,c;
}q[M];
int fa[N*3],n,m,last[N];
int find(int x){return x == fa[x] ? x : fa[x] = find(fa[x]);}
//判断是否有矛盾
bool conflict(int j){
int a = q[j].a, b = q[j].b, c = q[j].c;
if(c == 0){
if(find(a) == find(b+n) || find(a) == find(b+2*n))return true;
fa[find(a)] = find(b);
fa[find(a+n)] = find(b+n);
fa[find(a+2*n)] = find(b+2*n);
}else if(c == 1){//a<b
if(find(a) == find(b) || find(a) == find(b+n))return true;
fa[find(a+2*n)] = find(b+n);
fa[find(a)] = find(b+2*n);
fa[find(a+n)] = find(b);
}else{
if(find(a) == find(b) || find(a) == find(b+2*n))return true;
fa[find(a+2*n)] = find(b);
fa[find(a+n)] = find(b+2*n);
fa[find(a)] = find(b+n);
}
return false;
}
int main()
{
while(~scanf("%d%d",&n,&m)){
for(int i=1;i<=m;i++){
char ch;
scanf("%d%c%d",&q[i].a,&ch,&q[i].b);
if(ch == '=')q[i].c = 0;
else if(ch == '<')q[i].c = 1;
else q[i].c = 2;
q[i].a++;q[i].b++;
}
//last数组存放最早的矛盾对局号,如果循环结束后还是-1表示枚举的人可以是裁判
memset(last,-1,sizeof last);
for(int i=1;i<=n;i++){
for(int j=1;j<=n*3;j++)fa[j]=j;
for(int j=1;j<=m;j++){
if(q[j].a == i || q[j].b == i)continue;
if(conflict(j)){
last[i] = j;
break;
}
}
}
int cnt = 0, id = 1, times = 0;
for(int i=1;i<=n;i++){
if(last[i] == -1){
cnt ++;
id = i;
}
times = max(times,last[i]);
}
//cout << cnt << endl;
if(cnt > 1)puts("Can not determine");
else if(cnt == 1)printf("Player %d can be determined to be the judge after %d lines\n",id-1,times);
else puts("Impossible");
}
return 0;
}

最后感谢题解区的各位大佬

ACwing 258. 石头剪子布的更多相关文章

  1. AC日记——石头剪子布 openjudge 1.7 04

    04:石头剪子布 总时间限制:  1000ms 内存限制:  65536kB 描述 石头剪子布,是一种猜拳游戏.起源于中国,然后传到日本.朝鲜等地,随着亚欧贸易的不断发展它传到了欧洲,到了近现代逐渐风 ...

  2. hdu 4115 石头剪子布(2-sat问题)

    /* 意甲冠军:石头剪子布,目前已知n周围bob会有什么,对alice限制.供u,v,w:设w=0说明a,b回合必须出的一样 否则,必须不一样.alice假设输一回合就输了,否则就赢了 解: 2-sa ...

  3. Java练习 SDUT-2733_小鑫の日常系列故事(二)——石头剪子布

    小鑫の日常系列故事(二)--石头剪子布 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 小鑫在上幼儿园的时候,喜欢跟小伙 ...

  4. [luogu1327][生活大爆炸石头剪子布]

    题目地址 https://www.luogu.org/problemnew/show/P1328 题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负. ...

  5. Wikioi 3776 生活大爆炸版石头剪子布

    题目描述 Description 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8集中出现了一种石头剪刀布的升级版游戏 ...

  6. java 石头剪子布游戏

    源代码 StoneGame.java 1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.I ...

  7. AcWing 206. 石头游戏 矩阵乘法|矩阵快速幂

    AcWing 206. 石头游戏 石头游戏在一个 n 行 m 列 (1≤n,m≤8) 的网格上进行,每个格子对应一种操作序列,操作序列至多有10种,分别用0~9这10个数字指明. 操作序列是一个长度不 ...

  8. 《Visual Basic开发实战1200例》包括第I卷、第II卷共计1200个例子,本书是第I卷,共计600个例子。

    本书以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Visual Basic进行程序开发各个方面的知识和技巧.主要包括基础知识.窗体界面设计.控件应用等.全书分6篇20章,共计6 ...

  9. pygame学习笔记

    pygame参考文档pdf版:pygame API html版 pygame API 石头剪子布的简单小游戏,待改进的地方,自适应大小.感兴趣的小伙伴可以依据get_surface()返回值(即当前窗 ...

随机推荐

  1. 数仓建设中最常用模型--Kimball维度建模详解

    数仓建模首推书籍<数据仓库工具箱:维度建模权威指南>,本篇文章参考此书而作.文章首发公众号:五分钟学大数据,公众号中发送"维度建模"即可获取此书籍第三版电子书 先来介绍 ...

  2. shelll中test命令的使用【转】

    Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值.字符和文件三个方面的测试. 数值测试 参数 说明 -eq 等于则为真 -ne 不等于则为真 -gt 大于则为真 -ge 大于等于 ...

  3. LeetCode53 最大子序列问题

    题目描述: 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和.     示例:     输入: [-2,1,-3,4,-1,2,1,-5,4],   ...

  4. RPC 是通信协议吗 ?→ 我们来看下它的演进过程

    开心一刻 一实习小护士给我挂针,拿着针在我胳膊上扎了好几针也没找到血管 但这位小姑娘真镇定啊,表情严肃认真,势有不扎到血管不罢休的意思 十几针之后,我忍着剧痛,带着敬畏的表情问小护士:你这针法跟容嬷嬷 ...

  5. Java 使用URL类通过url下载网络资源

    主要用到的类 地址类: URL http类: HttpURLConnection 输入流: InputStream 输出流: FileOutputStream 上代码 package com.demo ...

  6. ps的参数解释

    [root@bogon ~]# ps axuUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND user启动进程的用户 pid  表示进程标志 ...

  7. 通过logmnr找到被修改前的存储过程

    1.找到存储过程被修改时的归档日志 SELECT NAME FROM V$ARCHIVED_LOG WHERE FIRST_TIME BETWEEN TO_DATE('20191118080000', ...

  8. const关键字:终于拥有真正的常量声明语句

    本文首发于个人网站:const关键字:终于拥有真正的常量声明语句 你好,今天大叔想和你唠扯唠扯 ES6 新增的关键字 -- const.在说 const 关键字之前,大叔先和你唠唠大叔自己对 cons ...

  9. IPC图像处理项目流程图

    网络摄像机IPC图像处理项目流程图:

  10. 前端工程构建之谈:gulp3要不要升级到Gulp4

    关于升级还是不升级,这是一个哲学问题. gulp4的语法更加现代,支持ES6的大部分写法,使用exports的方式去暴露任务组合,更加灵活和便捷. gulp4同时也提供了很多强大的API,例如para ...