照片分析:情侣亲密度的秘密 - 寻找亲密度更高的异性朋友

古人云:秀恩爱,分得快。

互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度。如果一张照片上出现了 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;
}

程序设计思路:

该程序通过分析给定的照片信息,计算人与人之间的亲密度,并找出给定情侣是否有亲密度更高的异性朋友。程序中使用了以下数据结构和函数:

  1. pair<double, int>:自定义的pair类型,用于存储每个人的亲密度和编号。

  2. vector<int> p[maxn]:存储每张照片中出现的人的编号。

  3. double rx[maxn], ry[maxn]:分别存储每个人与情侣A、B的亲密度。

  4. bool cmp(const P & x, const P & y):自定义的比较函数,用于在排序时按照亲密度从大到小排序,并保证情侣A和B排在前面。

  5. deal(int x, vector<P> & v):打印出与给定人x亲密度相同的人的编号。

程序的流程如下:

  1. 读取输入,包括总人数n、照片总数m和每张照片中出现的人的编号。

  2. 计算每个人与情侣A、B的亲密度,分别存储在rx和ry数组中。

  3. 构建两个vector,分别存储与情侣A、B异性的人的亲密度和编号。

  4. 对两个vector进行排序,按照亲密度从大到小排序,并保证情侣A和B排在前面。

  5. 判断情侣A和B是否有亲密度更高的异性朋友,如果有,则输出情侣A和B的编号;否则,输出与情侣A和B亲密度相同的人的编号。

总结:

该程序通过分析照片信息,计算人与人之间的亲密度,并找出给定情侣是否有亲密度更高的异性朋友。通过使用数据结构和函数,实现了对照片信息的处理和排序,从而得出最终结果。

照片分析:情侣亲密度的秘密 - 寻找亲密度更高的异性朋友

原文地址: https://www.cveoy.top/t/topic/qxYh 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录