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. NOIP初赛篇——09原码、反码和补码

    一.数的原码.补码和反码表示 机器数和真值 ​ 在计算机中,表示数值的数字符号只有0和1两个数码,我们规定最高位为符号位,并用0表示正符号,用1表示负符号.这样,机器中的数值和符号全"数码化 ...

  2. 废弃fastjson!大型项目迁移Gson保姆级攻略

    前言 大家好,又双叒叕见面了,我是天天放大家鸽子的蛮三刀. 在被大家取关之前,我立下一个"远大的理想",一定要在这周更新文章.现在看来,flag有用了... 本篇文章是我这一个多月 ...

  3. Python_列表(list)

    list()类中的提供的操作 1.索引取值 li = [11,22,33,44,55] v1 = li[3] print(li[2]) #索引取出33 print(v1) #索引取出44 print( ...

  4. 在 Azure 上执行一些简单的 python 工作

    1. 公司禁用了 python 我的主业是桌面开发,偶尔也需要搞搞数据和算法.最近在用 python 处理一些工作,正搞得热火朝天,突然 python 就不能用了,一查记录原来是 IT 管理员禁止我使 ...

  5. ctfshow—web—web4

    打开靶机 发现与web3很相似,测试文件包含未成功 此题有两种解决方法 一.日志注入 查看日志的默认目录,得到了日志文件 ?url=/var/log/nginx/access.log 进行日志注入 & ...

  6. oracle常用hint添加

    1.视图添加索引 /* Formatted on 2020/1/6 下午 04:46:37 (QP5 v5.163.1008.3004) */ SELECT /*+index(VIEW_NAME.TA ...

  7. LuoguP5075 [JSOI2012]分零食

    题意 有\(A\)个人,\(m\)个糖,你可以选择一个\(k\),使第\(1\)$k$个人每个人至少得到一个糖,并且第$k+1$\(A\)个人都得不到糖.\(m\)个糖必须给完.对于每个方案都有一个欢 ...

  8. Git安装/VScode+Git+Github

    Git安装/VScode+Git+Github 1. 相关简介 git 版本控制工具,支持该工具的网站有Github.BitBucket.Gitorious.国内的OS China仓库.Csdn仓库等 ...

  9. kettle数据质量统计

    1.利用Kettle的"分组","JavaScript代码","字段选择"组件,实现数据质量统计.2.熟练掌握"JavaScrip ...

  10. Jmeter如何录制APP客户端脚本

    简单五步教大家Jmeter录制APP客户端脚本: Step1 右键单击该测试计划,选择"添加"-"线程组",添加一个线程组. Step2 为了录制客户端的操作, ...