古人雲:秀恩愛,分得快。
互聯網上每天都有大量人發布大量照片,我們通過分析這些照片,可以分析人與人之間的親密度。如果一張照片上出現了 K 個人,這些人兩兩間的親密度就被定義為 1/K。任意兩個人如果同時出現在若干張照片里,他們之間的親密度就是所有這些同框照片對應的親密度之和。下面給定一批照片,請你分析一對給定的情侶,看看他們分別有沒有親密度更高的異性朋友?
輸入格式:
輸入在第一行給出 2 個正整數:N(不超過1000,為總人數——簡單起見,我們把所有人從 0 到 N-1 編號。為了區分性別,我們用編號前的負號表示女性)和 M(不超過1000,為照片總數)。隨后 M 行,每行給出一張照片的信息,格式如下:
K P[1] ... P[K]
其中 K(≤ 500)是該照片中出現的人數,P[1] ~ P[K] 就是這些人的編號。最后一行給出一對異性情侶的編號 A 和 B。同行數字以空格分隔。題目保證每個人只有一個性別,並且不會在同一張照片里出現多次。
輸出格式:
首先輸出 A PA
,其中 PA
是與 A
最親密的異性。如果 PA
不唯一,則按他們編號的絕對值遞增輸出;然后類似地輸出 B PB
。但如果 A
和 B
正是彼此親密度最高的一對,則只輸出他們的編號,無論是否還有其他人並列。
輸入樣例 1:
輸出樣例 1:
輸入樣例 2:
輸出樣例 2:
-3 2
注意:
不能更新所有異性的親密度
如果用一個1005*1005的浮點數組存儲任意兩個人之間的親密度,每次讀入一張照片時,我們都將照片內的任意兩異性之間的親密度更新一下,TLE。
所以我們先將照片信息存起來,然后只需遍歷和要查詢的兩個人有關的照片並更新和異性的親密關系就行了。
不能用int來讀取每個人的編號
如果直接int輸入會無法處理 -0,WA。
要用字符串輸入,再轉換成int
1 #include <bits/stdc++.h> 2 const int INF=0x3f3f3f3f; 3 typedef long long LL; 4 const double eps =1e-8; 5 const int mod=1e9+7; 6 const int maxn=1e4+10; 7 using namespace std; 8 9 int sex[1010];//=1表示為男 10 double A[1010];//a的親密度 11 double B[1010];//b的親密度 12 vector<int> P[1010];//照片 13 14 int to_int(string str)//轉換成數字 15 { 16 const char *p=str.c_str(); 17 return abs(atoi(p)); 18 } 19 20 int main() 21 { 22 #ifdef DEBUG 23 freopen("sample.txt","r",stdin); 24 #endif 25 26 int n,m; 27 cin>>n>>m; 28 for(int i=1;i<=m;i++) 29 { 30 int k; 31 cin>>k; 32 while(k--) 33 { 34 string str; 35 cin>>str; 36 int x=to_int(str); 37 P[i].push_back(x); 38 if(str[0]!='-') sex[x]=1; 39 } 40 } 41 string aa,bb; 42 cin>>aa>>bb; 43 int a=to_int(aa); 44 int b=to_int(bb); 45 double ma=0,mb=0; 46 for(int i=1;i<=m;i++) 47 { 48 int fa=0,fb=0;//表示a和b是否在這張圖片中出現過 49 for(int j=0;j<P[i].size();j++) 50 { 51 if(P[i][j]==a) fa=1; 52 if(P[i][j]==b) fb=1; 53 } 54 if(fa) 55 { 56 for(int j=0;j<P[i].size();j++) 57 { 58 if(sex[a]!=sex[P[i][j]]) 59 { 60 A[P[i][j]]+=1.0/P[i].size(); 61 ma=max(ma,A[P[i][j]]); 62 } 63 } 64 } 65 if(fb) 66 { 67 for(int j=0;j<P[i].size();j++) 68 { 69 if(sex[b]!=sex[P[i][j]]) 70 { 71 B[P[i][j]]+=1.0/P[i].size(); 72 mb=max(mb,B[P[i][j]]); 73 } 74 } 75 } 76 } 77 if(ma==A[b]&&mb==B[a]) cout<<aa<<' '<<bb<<endl; 78 else 79 { 80 for(int i=0;i<n;i++) 81 { 82 if(ma==A[i]) 83 { 84 cout<<aa<<' '; 85 if(sex[i]!=1) cout<<'-'; 86 cout<<i<<endl; 87 } 88 } 89 for(int i=0;i<n;i++) 90 { 91 if(mb==B[i]) 92 { 93 cout<<bb<<' '; 94 if(sex[i]!=1) cout<<'-'; 95 cout<<i<<endl; 96 } 97 } 98 } 99 100 return 0; 101 }
-