https://codeforces.com/problemset/problem/993/b
题意:
现在有两个人,每个人手中有两个数,其中两个人手中的数有一个是相同的(另一个不一样),
现在第一个人会给你n对数,保证其中一对就是他手上的两个数,第二个人会给你m对数,保证其中一对是他手上的两个数。
现在你作为一个旁观者,如果能分辨出相同的数,则输出它,如果你知道手上有牌的人知道相同的数,那么输出0,其余则输出-1。
思路:
其实就是n对和m对数中,找共享数字,直接看样例吧:
在第一示例中,第一参与者通信对(1,2)和(3,4),第二参与者通信对(1,5),(3,4)。因为我们知道,他们收到的实际对共享一个数字,这不可能是他们都有(3,4)。因此,第一个参与者有(1,2),第二个参与者有(1,5),此时您已经知道共享号码是1。
在第二个例子中,第一个参与者有(1,2),第二个有(1,5),或者第一个有(3,4),第二个有(6,4)。在第一种情况下,他们都知道共享号码是1,在第二种情况下,他们都知道共享号码是4。你没有足够的信息来区分1和4。
在第三种情况下,如果第一个参与者被给予(1,2),他们不知道共享号码是什么,因为从他们的角度来看,第二个参与者可能被给予(1,3),在这种情况下共享号码是1,或者(2,3),在这种情况下共享号码是2。虽然第二个参与者确实知道数字,但您和第一个参与者都不知道,因此输出为-1。
注意:要跑两遍
代码如下:
1 #include <stdio.h>
2 #include <string.h>
3 #include <iostream>
4 #include <string>
5 #include <math.h>
6 #include <algorithm>
7 #include <vector>
8 #include <stack>
9 #include <queue>
10 #include <set>
11 #include <map>
12 #include <sstream>
13 const int INF=0x3f3f3f3f;
14 typedef long long LL;
15 const int mod=1e9+7;
16 //const double PI=acos(-1);
17 #define Bug cout<<"---------------------"<<endl
18 const int maxn=1e5+10;
19 using namespace std;
20
21 vector<pair<int,int> > vt1;
22 vector<pair<int,int> > vt2;
23
24 int main()
25 {
26 int n,m;
27 scanf("%d %d",&n,&m);
28 for(int i=1;i<=n;i++)
29 {
30 int x,y;
31 scanf("%d %d",&x,&y);
32 vt1.push_back(make_pair(min(x,y),max(x,y)));
33 }
34 for(int i=1;i<=m;i++)
35 {
36 int x,y;
37 scanf("%d %d",&x,&y);
38 vt2.push_back(make_pair(min(x,y),max(x,y)));
39 }
40 int f1[10]={0};
41 int tag=0;//判断一组中两个数是否均为共享数字
42 for(vector<pair<int,int> >::iterator it1=vt1.begin();it1!=vt1.end();it1++)
43 {
44 int a=it1->first;
45 int b=it1->second;
46 int f[2]={0};//看该组两个数字是否均为共享数字
47 for(vector<pair<int,int> >::iterator it2=vt2.begin();it2!=vt2.end();it2++)
48 {
49 int c=it2->first;
50 int d=it2->second;
51 if(a==c&&b==d)
52 continue;
53 if(a==c&&b!=d)
54 {
55 f1[a]++;
56 f[0]=1;
57 }
58 else if(b==c)
59 {
60 f1[b]++;
61 f[1]=1;
62 }
63 else if(a==d)
64 {
65 f1[a]++;
66 f[0]=1;
67 }
68 else if(b==d)
69 {
70 f1[b]++;
71 f[1]=1;
72 }
73 }
74 if(f[0]&&f[1])
75 tag=1;
76 }
77 int f2[10]={0};
78 for(vector<pair<int,int> >::iterator it1=vt2.begin();it1!=vt2.end();it1++)//再从第二个人跑一遍
79 {
80 int a=it1->first;
81 int b=it1->second;
82 int f[2]={0};
83 for(vector<pair<int,int> >::iterator it2=vt1.begin();it2!=vt1.end();it2++)
84 {
85 int c=it2->first;
86 int d=it2->second;
87 if(a==c&&b==d)
88 continue;
89 if(a==c&&b!=d)
90 {
91 f2[a]++;
92 f[0]=1;
93 }
94 else if(b==c)
95 {
96 f2[b]++;
97 f[1]=1;
98 }
99 else if(a==d)
100 {
101 f2[a]++;
102 f[0]=1;
103 }
104 else if(b==d)
105 {
106 f2[b]++;
107 f[1]=1;
108 }
109 }
110 if(f[0]&&f[1])
111 tag=1;
112 }
113 int num=0;
114 int ans=0;
115 for(int i=1;i<=9;i++)
116 {
117 if(f1[i])
118 {
119 num++;
120 ans=i;
121 }
122 }
123 if(tag)
124 printf("-1\n");
125 else
126 {
127 if(num==1)
128 printf("%d\n",ans);
129 else
130 printf("0\n");
131 }
132 return 0;
133 }
知识兔