CF993B Solution

题目链接

题解

可以发现,只有当一位测试者(设其为甲)的1对数字同时可以与另一位测试者(设其为乙)的2个在不同对中的数字相等时,乙无法确定甲的数字,应输出-1。而当甲有\(>1\)个在不同对中的数字与乙的\(>1\)个在不同对中的数字相等时,我们无法确定他们的数字,应输出0。若不符合上述条件,则输出甲、乙中唯一一个相等且在不同对的数字即可。

具体实现:可以将甲、乙的数字分别存入两个下标从\(0\)开始的数组,与下表为\(i\)的数在同一数对中的数下标为\(i^{\wedge} 1\),这样不用将数对中的数分开处理。注意当数据同时满足-1和0的条件时,-1的优先级大于0的优先级,因此需存储当前满足的条件,最后输出。此外,相同数字可能会在同一人的不同数对中出现多次,需判断。甲、乙是否可以判断需分两次处理,因为可能会出现一方无法判断的情况(如题目样例3)。

#include<bits/stdc++.h>
using namespace std;
const int N=30;
int a[N],b[N];
bool pa[N],pb[N]; //pa/pb[i]:a/b数组中下标为i的元素是否(1/0)在b/a数组中有相同的数字
int main()
{
	int n,m,ans=0; 
	bool qwq=0,qaq=0;//qwq/qaq:是否(1/0)满足-1/0的条件
	scanf("%d%d",&n,&m);
	for(int i=0;i<2*n;i++) scanf("%d",&a[i]);
	for(int i=0;i<2*m;i++) scanf("%d",&b[i]);
	for(int i=0;i<2*n;i++)//a测试者
	{
		for(int j=0;j<2*m;j++)
			if(a[i]==b[j] && a[i^1]!=b[j^1]) pa[i]=1;//需判断两个数对不完全相同
		if(pa[i]&pa[i^1]) qwq=1;
		if(pa[i] && ans && ans!=a[i]) qaq=1;
		else if(pa[i]) ans=a[i];
	}
	for(int i=0;i<2*m;i++)//b测试者
	{
		for(int j=0;j<2*n;j++)
			if(b[i]==a[j] && b[i^1]!=a[j^1]) pb[i]=1;
		if(pb[i]&pb[i^1]) qwq=1;
        //因为输出0或结果的情况a、b的答案是一样的,不用再次更新
	}
	if(qwq==1) printf("-1");
	else if(qaq==1) printf("0");
	else printf("%d",ans);
	return 0;	
}
原文地址:https://www.cnblogs.com/violetholmes/p/14354569.html