PAT L2-028 秀恩愛分得快
阿新 • • 發佈:2018-08-19
人的 互聯網 https 兩個 bits c++ 分析 區分 esp
https://pintia.cn/problem-sets/994805046380707840/problems/994805054698012672
古人雲:秀恩愛,分得快。
互聯網上每天都有大量人發布大量照片,我們通過分析這些照片,可以分析人與人之間的親密度。如果一張照片上出現了 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:
10 4 4 -1 2 -3 4 4 2 -3 -5 -6 3 2 4 -5 3 -6 0 2 -3 2
輸出樣例 1:
-3 2
2 -5
2 -6
輸入樣例 2:
4 4
4 -1 2 -3 0
2 0 -3
2 2 -3
2 -1 2
-3 2
輸出樣例 2:
-3 2
時間復雜度:
$O( \sum_{i=1}^Nk_i)$
代碼:
#include <bits/stdc++.h> using namespace std; int N, M; int p[1010][510]; bool sex[1010]; int k[1010]; int A[3][1010], B[3][1010], cnt[2]; int ssex[3], nnum[3]; char op[1010]; int num, Sex; double q[1010]; struct Ans { int id; bool sex; double val; }ans[1010]; int sz; void T() { if(op[0] == ‘-‘) Sex = 0; else Sex = 1; num = 0; for(int i = 0; op[i]; i ++) { if(op[i] >= ‘0‘ && op[i] <= ‘9‘) { num = num * 10 + op[i] - ‘0‘; } } } bool G(int x) { for(int i = 1; i <= k[x]; i ++) { if(num == p[x][i]) return 1; } return 0; } bool cmp(const Ans& a, const Ans& b) { if(a.val != b.val) return a.val > b.val; return a.id < b.id; } void display(int sex, int id) { if(sex == 0) { printf("-%d", id); return ; } printf("%d", id); } int main() { scanf("%d %d", &N, &M); for(int i = 1; i <= M; i ++) { scanf("%d", &k[i]); for(int j = 1; j <= k[i]; j ++) { scanf("%s", op); T(); p[i][j] = num; sex[p[i][j]] = Sex; } } for(int r = 1; r <= 2; r ++) { memset(q, 0, sizeof q); scanf("%s", op); T(); ssex[r] = Sex; nnum[r] = num; for(int i = 1; i <= M; i ++) { if(!G(i)) continue; for(int j = 1; j <= k[i]; j ++) { if(Sex == sex[p[i][j]]) continue; q[p[i][j]] += 1.0 / k[i]; } } sz = 0; for(int i = 0; i < N; i ++) { if(Sex == sex[i]) continue; ans[sz].id = i; ans[sz].sex = sex[i]; ans[sz].val = q[i]; sz ++; } sort(ans, ans + sz, cmp); for(int i = 0; i < sz; i ++) { if(ans[i].val == ans[0].val) { A[r][cnt[r]] = ans[i].id; B[r][cnt[r]] = ans[i].sex; cnt[r] ++; } } } int flag1 = 0; int flag2 = 0; for(int i = 0; i < cnt[2]; i ++) { if(nnum[1] == A[2][i]) flag1 = 1; } for(int i = 0; i < cnt[1]; i ++) { if(nnum[2] == A[1][i]) flag2 = 1; } if(flag1 && flag2) { display(ssex[1], nnum[1]); printf(" "); display(ssex[2], nnum[2]); printf("\n"); } else { for(int r = 1; r <= 2; r ++) { for(int i = 0; i < cnt[r]; i ++) { display(ssex[r], nnum[r]); printf(" "); display(B[r][i], A[r][i]); printf("\n"); } } } return 0; }
PAT L2-028 秀恩愛分得快