照片分析:情侣亲密度的秘密 - 寻找亲密度更高的异性朋友
照片分析:情侣亲密度的秘密 - 寻找亲密度更高的异性朋友
古人云:秀恩爱,分得快。
互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度。如果一张照片上出现了 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。同行数字以空格分隔。题目保证每个人只有一个性别,并且不会在同一张照片里出现多次。
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define sc second
typedef pair<double, int> P;
const int maxn = 1005;
int n, m, sex[maxn], a, b;
vector<int> p[maxn];
double rx[maxn], ry[maxn];
inline int read() {
int x = 0, f = 1; char c = getchar();
while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); }
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
sex[x] = f;
return x;
}
inline void out(int x) { if(x > 9) out(x/10); putchar(x % 10 + '0'); }
inline void put(int & x,int & y) {
if(sex[x] < 0) putchar('-'); out(x); putchar(' ');
if(sex[y] < 0) putchar('-'); out(y); putchar('
');
}
bool cmp(const P & x, const P & y) {
if(x.fi == y.fi) {
if(x.sc == a || x.sc == b) return true;
if(y.sc== a || y.sc == b) return false;
return x.sc < y.sc;
}
return x.fi > y.fi;
}
inline void deal(int x, vector<P> & v) {
for(int i = 0; i < v.size(); i++) {
if(i && v[i].fi < v[i - 1].fi) break;
put(x, v[i].sc);
}
}
int main() {
#ifdef MyTest
freopen("Sakura.txt", "r", stdin);
#endif
scanf("%d %d", &n, &m);
for(int i = 0; i < m; i++) {
int k; scanf("%d", &k);
p[i].resize(k);
for(int j = 0; j < k; j++) p[i][j] = read();
}
a = read(), b = read();
for(int i = 0; i < m; i++) for(int & x : p[i]) {
if(x == a) for(int & y : p[i]) rx[y] += 1.0 / p[i].size();
if(x == b) for(int & y : p[i]) ry[y] += 1.0 / p[i].size();
}
vector<P> pa, pb;
for(int i = 0; i < n; i++) {
if((sex[i] ^ sex[a]) < 0) pa.push_back(P(rx[i], i));
if((sex[i] ^ sex[b]) < 0) pb.push_back(P(ry[i], i));
}
sort(pa.begin(), pa.end(), cmp);
sort(pb.begin(), pb.end(), cmp);
if(pa.size() && pb.size() && pa[0].sc == b && pb[0].sc == a) put(a, b);
else { deal(a, pa); deal(b, pb); }
return 0;
}
程序设计思路:
该程序通过分析给定的照片信息,计算人与人之间的亲密度,并找出给定情侣是否有亲密度更高的异性朋友。程序中使用了以下数据结构和函数:
-
pair<double, int>:自定义的pair类型,用于存储每个人的亲密度和编号。 -
vector<int> p[maxn]:存储每张照片中出现的人的编号。 -
double rx[maxn], ry[maxn]:分别存储每个人与情侣A、B的亲密度。 -
bool cmp(const P & x, const P & y):自定义的比较函数,用于在排序时按照亲密度从大到小排序,并保证情侣A和B排在前面。 -
deal(int x, vector<P> & v):打印出与给定人x亲密度相同的人的编号。
程序的流程如下:
-
读取输入,包括总人数n、照片总数m和每张照片中出现的人的编号。
-
计算每个人与情侣A、B的亲密度,分别存储在rx和ry数组中。
-
构建两个vector,分别存储与情侣A、B异性的人的亲密度和编号。
-
对两个vector进行排序,按照亲密度从大到小排序,并保证情侣A和B排在前面。
-
判断情侣A和B是否有亲密度更高的异性朋友,如果有,则输出情侣A和B的编号;否则,输出与情侣A和B亲密度相同的人的编号。
总结:
该程序通过分析照片信息,计算人与人之间的亲密度,并找出给定情侣是否有亲密度更高的异性朋友。通过使用数据结构和函数,实现了对照片信息的处理和排序,从而得出最终结果。
原文地址: https://www.cveoy.top/t/topic/qxYh 著作权归作者所有。请勿转载和采集!