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 }
原文地址:https://www.cnblogs.com/jiamian/p/11708145.html
时间: 2024-10-15 11:56:18