古人云:秀恩爱,分得快。
互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度。如果一张照片上出现了 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
1 #include <iostream> 2 #include <queue> 3 #include <stack> 4 #include <cstdio> 5 #include <string> 6 #include <cstring> 7 #include <cmath> 8 #include <vector> 9 #include <algorithm> 10 #define Mod 19999997 11 typedef long long ll; 12 using namespace std; 13 bool flag[1005]; 14 15 16 int read() { 17 int input = 0, sign = 0; 18 char a = getchar(); 19 while ((a<'0' || a>'9') && a != '-') 20 a = getchar(); 21 if (a == '-') { 22 sign = 1; 23 a = getchar(); 24 } 25 while (a >= '0' && a <= '9') { 26 input = input * 10 + a - '0'; 27 a = getchar(); 28 } 29 flag[input] = sign; //女性用true标记 30 return input; 31 } 32 int main() { 33 int n, m; 34 while (scanf("%d%d", &n, &m) != EOF) { 35 memset(flag, false, sizeof(flag)); 36 vector<vector<int> >p(n); //存储所有照片 37 vector<double> PA(n, 0.0), PB(n, 0.0); //与A的亲密度,与B的亲密度 38 int coloum; 39 for (int i = 0; i < m; ++i) { 40 scanf("%d", &coloum); 41 p[i].resize(coloum); 42 for (int j = 0; j < coloum; ++j) { 43 p[i][j] = read(); 44 } 45 } 46 int A, B; 47 A = read(), B = read(); 48 double MAXA = 0.0, MAXB = 0.0; 49 for (int i = 0; i < m; ++i) { 50 bool FindA = find(p[i].begin(), p[i].end(), A) != p[i].end(); //查找A 51 bool FindB = find(p[i].begin(), p[i].end(), B) != p[i].end(); //查找B 52 if (FindA || FindB) { 53 for (int j = 0; j < p[i].size(); ++j) { 54 if (FindA && flag[A] != flag[p[i][j]]) { 55 PA[p[i][j]] += (double)1.0 / p[i].size(); //亲密度累加 56 MAXA = max(MAXA, PA[p[i][j]]); //最大亲密度 57 } 58 else if (FindB && flag[B] != flag[p[i][j]]) { 59 PB[p[i][j]] += (double)1.0 / p[i].size(); 60 MAXB = max(MAXB, PB[p[i][j]]); 61 } 62 } 63 } 64 } 65 if (MAXA == PA[B] && MAXB == PB[A]) { //彼此亲密度最高 66 printf("%s%d %s%d ", flag[A] ? "-" : "", A, flag[B] ? "-" : "", B); 67 } 68 else { 69 for (int i = 0; i < n; i++) { 70 if (PA[i] == MAXA) { 71 printf("%s%d %s%d ", flag[A] ? "-" : "", A, flag[i] ? "-" : "", i); 72 } 73 } 74 for (int i = 0; i < n; i++) { 75 if (PB[i] == MAXB) { 76 printf("%s%d %s%d ", flag[B] ? "-" : "", B, flag[i] ? "-" : "", i); 77 } 78 } 79 } 80 } 81 }