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. maven打包时排除配置文件

    上网查了一下,直接在pom里面配置就好了,具体写法如下所示 <build> ... <resources> <resource> <directory> ...

  2. C语言实现蛇形矩阵

    今天大一考试C语言的时候看见了这道题,下面是我转载的一个大佬的博客,自认为分析的很清楚,特来分享一下. **原文地址: https://blog.csdn.net/jack22333/article/ ...

  3. Linux性能相关命令

    Linux性能相关命令 目录 Linux性能相关命令 1. 查看硬盘相关信息 2. 查看CPU相关信息 3. 查看内存相关信息 4. 查看进程运行的信息 1. 查看硬盘相关信息 cat /proc/s ...

  4. [SSL]在线检查服务器HTTPS安全

    https://myssl.com/ SSL/TLS安全评估报告 https://www.ssllabs.com/ssltest/ SSL Server Test HTTPS开启工具(IIS) htt ...

  5. Java编程开发之浅析Java引用机制

    对于一个Java的对象而言,存储主要分为两种,一种是内存堆(Heap),内存堆是无序的,主要用来存放创建的Java对象:一种是内存栈(Stack),主要用来存放Java引用,然后在管理过程使用Java ...

  6. STL_string容器

    一.string概念 string是STL的字符串类型,通常用来表示字符串.而在使用string之前,字符串通常是用char*表示的.string与char*都可以用来表示字符串,那么二者有什么区别. ...

  7. widnows2008双网卡双ip不同Ip段

    机房内有不同段ip,因为线路不一样,比如普通带宽和cn2带宽,现有需求配置双网卡双ip ip1: 121.7*.*.*  255.255.255.192 121.7*.*129 ip2: 103.11 ...

  8. try-catch-finally中的4个大坑,不小心就栽进去了!

    在 Java 语言中 try-catch-finally 看似简单,一副人畜无害的样子,但想要真正的"掌控"它,却并不是一件容易的事.别的不说,咱就拿 fianlly 来说吧,别看 ...

  9. Redis 实战 —— 09. 实现任务队列、消息拉取和文件分发

    任务队列 P133 通过将待执行任务的相关信息放入队列里面,并在之后对队列进行处理,可以推迟执行那些耗时对操作,这种将工作交给任务处理器来执行对做法被称为任务队列 (task queue) . P13 ...

  10. CSS Color Adjustment Module Level 1

    CSS Color Adjustment Module Level 1 https://drafts.csswg.org/css-color-adjust-1/ DarkMode 适配指南 | 微信开 ...