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. Go语言快速安装手册

    Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ia ...

  2. 用python+sklearn(机器学习)实现天气预报数据 模型和使用

    用python+sklearn机器学习实现天气预报 模型和使用 项目地址 系列教程 0.前言 1.建立模型 a.准备 引入所需要的头文件 选择模型 选择评估方法 获取数据集 b.建立模型 c.获取模型 ...

  3. Array.apply(null, {length: 2}) 的理解

    // apply 的第二参数通常是数组 但是也可以传递类数组对象{length: 2}console.log(Array.apply(null, {length: 2})) // [undefined ...

  4. 深入理解static、volatile关键字

    static 意思是静态的,全局的.被修饰的东西在一定范围内是共享的,被类的所有实例共享,这时候需要注意并发读写的问题. 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内找到他们. ...

  5. Docker学习笔记之查看Docker

    命令: 使用history命令查看镜像历史 使用cp命令复制容器中的文件到主机 使用commit命令把修改过的容器创建为镜像 使用diff命令检查容器文件的修改 使用inspect命令查看容器/镜像详 ...

  6. 【Linux】find删除365天以前的文件详细解析

    find . -name "*" -mtime +365 -exec rm -rf {} \; -mtime +365  文件被修改的时间,最后一次发生到现在365天 -atime ...

  7. 在Ubuntu18.04下编译出ffmpeg(支持推流H265成rtmp)

    Ubuntu18.04下编译libx264.libx265.libfdk_aac和ffmpeg 一.编译x264库 二.编译fdk-aac库 三.编译x265库 四.编译FFmpeg源码 五.设置环境 ...

  8. win32 sdk 环境下创建状态栏

    今天在学习状态栏,出了好多的问题,这里记录下. 要创建状态栏用:CreateStatusWindow CreateStatusWindow函数创建一个状态窗口,通常用于显示应用程序的状态.窗口通常显示 ...

  9. 微人事项目-mybatis-持久层

    摘要 最近将微人事这个开源项目进行了复现,这篇文章记录mybaits访问数据库这一块. 其中MyBatis是一个流行的持久层框架,支持自定义SQL.存储过程和高级映射.MyBatis消除了几乎所有的J ...

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

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