Codeforces Round #488 by NEAR (Div. 2)D. Open Communication
阿新 • • 發佈:2019-01-03
題目連結:
題目大意:有兩個參選者。第一行兩個數字n,m。代表第一個參選者有n對數字,第二個參選者有m對數字。
每一對兩個數字有要求:即每一對的兩個數字均是不一樣的,且同一個參選者不可能擁有兩對相同的數字對
現在他們進行一個匹配推測數字,即參選者1中的一對數字a,b和參選者2中一對數字c,d,滿足其中一個數字相同,另一個數字不同則說明他們之間的公共數字是那個相同的數字。如果這對數字中的兩個數字都相同的話,不成立,直接跳過這一對。現在就是讓我們判斷我們能否推斷出他們的公共數字,以及他們自己能否推斷出那個公共數字。
都不能推斷出則輸出-1,都能則輸出那個公共數字,我們不能他們參選者能的話輸出0
思路:
1.參選者1中的每一對數字,對參選者2的每一對進行遍歷匹配,判斷這一對數字能否找出公共數字,以及判斷找出的公共數字是否相同。如果對應參選者1中的每一對數字能夠找出一對,那麼這對數字是可以被我們推測出來的,如果有多個公共數字,那麼我們是不可以推測出來的。
2.對參選者2進行1中的操作
3.最後進行一個判斷,如果有一對數字他的公共數字有多個,則輸出-1
如果有多對數字,他們每一對都有一個公共數字,且這些公共數字至少有兩個是不一樣的,這樣我們不知道,但參選者知道
如果只有一對數字有公共數字,或者有多對數字,他們每一對都有一個公共數字,但這些公共數字是一樣的,那麼我們和參選者都知道
AC程式碼如下:
#include<bits/stdc++.h> using namespace std; const double eps=1e-10; const int maxn=1000+10; struct node { int u,v; }a[maxn],b[maxn]; int c; int main() { int n,m; cin>>n>>m; for(int i=0;i<n;i++) { cin>>a[i].u>>a[i].v; } for(int i=0;i<m;i++) { cin>>b[i].u>>b[i].v; } c=-1; int ans=1; for(int i=0;i<n;i++) { int first=0,second=0; for(int j=0;j<m;j++) { if(min(a[i].v,a[i].u)==min(b[j].v,b[j].u)&&max(a[i].v,a[i].u)==max(b[j].v,b[j].u))continue; if(a[i].u==b[j].u||a[i].u==b[j].v)first++; if(a[i].v==b[j].u||a[i].v==b[j].v)second++; } if(first>0&&second>0) { ans=-1; break; } else if(ans==1&&(first>0||second>0)) { if(c==-1) { if(first>0)c=a[i].u; else if(second>0)c=a[i].v; } else { if(first>0&&c!=a[i].u)ans=0; else if(second>0&&c!=a[i].v)ans=0; } } } for(int i=0;i<m;i++) { int first=0,second=0; for(int j=0;j<n;j++) { if(min(a[j].v,a[j].u)==min(b[i].v,b[i].u)&&max(a[j].v,a[j].u)==max(b[i].v,b[i].u))continue; if(b[i].u==a[j].u||b[i].u==a[j].v)first++; if(b[i].v==a[j].u||b[i].v==a[j].v)second++; } if(first>0&&second>0) { ans=-1; break; } else if(ans==1&&(first>0||second>0)) { if(c==-1) { if(first>0)c=b[i].u; else if(second>0)c=b[i].v; } else { if(first>0&&c!=b[i].u)ans=0; else if(second>0&&c!=b[i].v)ans=0; } } } if(ans>0)printf("%d\n",c); else printf("%d\n",ans); return 0; }