奶牛贝茜和奶牛贝蒂各有一个整数数对。
每个数对都包含两个 1∼9 之间的不同整数。
这两个数对恰好包含一个公共数,即恰好有一个整数同时包含于这两个数对。
初始时,贝茜和贝蒂都只知道自己拥有的数对,而不清楚对方拥有的数对。
它们希望通过网络交流来获知彼此数对的公共数。
但是,它们清楚所有交流信息一定会被农夫约翰截获,且约翰也知道这两个数对恰好包含一个公共数。
为了让截获到交流信息的约翰无法获知这个公共数,它们决定采用如下方式加密信息。
贝茜会准备 n 个两两不同的数对,这些数对均包含两个 1∼9 之间的不同整数,其中一个数对恰好是它拥有的数对,它会将这些数对全部发送给贝蒂。
贝蒂会准备 m 个两两不同的数对,这些数对均包含两个 1∼9 之间的不同整数,其中一个数对恰好是它拥有的数对,它会将这些数对全部发送给贝茜。
当然,约翰会将这些数对(以及是谁发送的)全部获知。
请你对给定信息进行判断,并按要求输出:
- 如果这些信息足以令约翰准确地推断出公共数字,则输出这个公共数字。
- 如果这些信息不足以令约翰准确地推断出公共数字,但是不论两头奶牛各自拥有哪个数对,都足以令两头奶牛都准确地推断出公共数字,则输出 0。
- 以上都不是,则输出 -1。
输入格式
-
第一行包含两个整数 n,m。
-
第二行包含 n 个两两不同的数对,这些数对均包含两个 1∼9 之间的不同整数,表示贝茜准备的数对。
-
第三行包含 m 个两两不同的数对,这些数对均包含两个 1∼9 之间的不同整数,表示贝蒂准备的数对。
在本题中,(1,2) 和 (2,1) 视为同一数对。
数据保证双方拥有的数对包含于各自给出的数对当中,且双方拥有的数对恰好包含一个公共数。
输出格式
按照题目要求,输出公共数字或 0 或 -1。
输入样例1:
2 2
1 2 3 4
1 5 3 4
输出样例1:
1
输入样例2:
2 2
1 2 3 4
1 5 6 4
输出样例2:
0
输入样例3:
2 3
1 2 4 5
1 2 1 3 2 3
输出样例3:
-1
数据范围与提示
前 4 个测试点满足 1≤n,m≤3。
所有测试点满足 1≤n,m≤12。
正解
理解题意后发现一共会出现三种情况:
- 农夫和奶牛都能得知公共数字,这是输出该数字;
- 农夫不知道,但奶牛知道公共数字,输出0;
- 农夫和奶牛都不能得知公共数字,输出-1;
有没有农夫知道但奶牛不知道公共数字的情况:
因为奶牛知道它本身的数对,而农夫的信息少,如果农夫可以推出公共数字,那么奶牛一定也知道,所以只有三种情况,
所以我们用ans[2]中三个变量记录答案:
ans[0]存的是三种情况,分别对应1,大于1,小于1(等下再解释为什么这么对应),ans[1]存要输出的公共数字(不输出公共数字的情况就不用管它了);
ACcode
#include<bits/stdc++.h>
using namespace std;
int n,m,ans[2];//ans存输出
int x[19],y[19];//分别存两头牛数对和其他数对对应的次数
struct par{
int x,y;
}bx[19],bd[19];//存两头牛准备好的数对
void cys(int in,int i,int j){
//如果ans[1]不等于要更新的in,说明有多个公共数字可以对应
if(ans[1]!=in){
ans[0]++;
//更新数对的对应次数
x[i]++;
y[j]++;
}
ans[1]=in;//更新当前的公共数字
}
int main(){
scanf("%d%d",&n,&m);
//读入两头牛的数对
for(int i=1;i<=n;i++) scanf("%d%d",&bx[i].x,&bx[i].y);
for(int i=1;i<=m;i++) scanf("%d%d",&bd[i].x,&bd[i].y);
//将所有数对一一对应,找出符合条件的更新数字(数据范围不到20,放心套循环)
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
//两头牛的原始数对只有1个数相同,另一个不同,找出这种情况进行更新
if(bx[i].x==bd[j].x&&bx[i].y!=bd[j].y) cys(bx[i].x,i,j);
if(bx[i].x!=bd[j].x&&bx[i].y==bd[j].y) cys(bx[i].y,i,j);
if(bx[i].x==bd[j].y&&bx[i].y!=bd[j].x) cys(bx[i].x,i,j);
if(bx[i].x!=bd[j].y&&bx[i].y==bd[j].x) cys(bx[i].y,i,j);
//如果同一个数对与别的数对对应次数超过1
//说明拿这个原始数对的奶牛无法推断公共数字在哪个数对里
//符合第三种情况,把ans[0]赋为负数
if(x[i]>1||y[j]>1) ans[0]=-32767;
}
}
//只有一对数对有唯一的公共数字,农夫可以推断出
if(ans[0]==1) printf("%d\n",ans[1]);
//有多对数对出现公共数字 ,但不同数对的公共数字不同
//奶牛可以通过自己的原始数对推断出公共数字,但农夫不行
else if(ans[0]>1) printf("0");
//同一个数对里的两个数都能与别的某个数对存在公共数字
//奶牛和农夫都无法推断公共数字,输出-1
else if(ans[0]<1) printf("-1");
return 0;
}
第一次自己写题解,感谢各位神犇的支持!
对了,这是传送门
浙公网安备 33010602011771号