ACwing 258. 石头剪子布
2024-10-19 04:09:17
258. 石头剪子布
题意挺好理解,但是当我看样例的时候就傻了。不是说好的只有一个裁判的吗?出现矛盾的时候该怎么判定裁判?
分析
观察这个数据量就会发觉是有猫腻的,直接从正面求出裁判并不是很容易,那么直接枚举裁判呢?由于裁判是可以随便出的,那么把它从所有对局中除去后理应没有矛盾才对。所以就有了如下做法
枚举裁判,从前往后遍历对局,按照并查集例题食物链的做法去处理就行。可能遇到的情况有下面两种
直到发现第一个矛盾,那么当前枚举的这个人就不应该是裁判。然后把当前对局标号记录下来,表示最早到该对局时可以发现裁判并不是当前枚举的这个人。
从头到尾没有矛盾,那么这个人可能就是裁判,答案结果数+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;
}
最后感谢题解区的各位大佬
最新文章
- 【翻译三】java-并发之线程对象和实现
- Swift Tour 随笔总结 (2)
- SRM 392(1-250pt)
- 项目管理软件伙伴https://www.huobanyun.cn/
- 第三天 Java语言基础
- ubantu/centos修改系统时间
- 网络编程基础【day10】:我是一个进程(三)
- IP路由实验之---Telnet远程登陆
- 雷林鹏分享:C# 数据类型
- 解决Devexpress ChartControl的CalcHitInfo当中SeriesPoint为Null的问题
- 21 模块(collections,time,random,os,sys)
- Linux修改开机启动logo
- BZOJ2694:Lcm——包看得懂/看不懂题解
- C++和C# WebService相互调用
- AcWing 153. 双栈排序
- 简单的WSGI server
- C#实现对EXCEL指定单元格进行操作
- destoon 支付异步接口文件 notify.php 调试方式
- 找top 10信息
- Jmeter之添加响应断言,bean shell post processor
热门文章
- Linux服务器下安装Composer 并使用Composer安装Thinkphp5.0
- navicat for mysql 破解版
- JavaScript DOM编程艺术(第2版)的简单总结
- requests+BeautifulSoup | 爬取电影天堂全站电影资源
- SQL注入-流程
- Spring MVC 接收 LocalDate、LocalTime 和 LocalDateTime Java 8 时间类型参数
- nginx日志按天切割
- DG主备切换遇到not allwod或者RESOLVABLE GAP解决办法
- ctfhub技能树—sql注入—整数型注入
- 国内最具影响力科技创投媒体36Kr的容器化之路