• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
jacklee404
Never Stop!
博客园    首页    新随笔    联系   管理    订阅  订阅
L2-044 大众情人

题目传送门

思路: 纯纯Floyd

阅读理解题:一个人的异性缘不是由最喜欢他/她的那个异性决定的,而是由对他/她最无感的那个异性决定的。我们记一个人 i 在一个异性 j 眼中的距离感为 \(D_{ij}\);将 i 的“异性缘”定义为 1/maxj∈S(i){\(D_{ij}\)},其中 S(i) 是相对于 i 的所有异性的集合。那么“大众情人”就是异性缘最好(值最大)的那个人。

一开始做的时候,一位是枚举最小的\(d_{ij}\),没想到找了半天bug,发现是让找最小的\(d_{ji}\)

#include <bits/stdc++.h>
#define f first
#define s second
#define INF 0x3f3f3f3f
#define rep(i, j, k) for(int i = j; i <= k; i ++)
using namespace std;

const int N = 550;

int n;

int d[N][N], sex[N];

void floyd() {
	for (int k = 1; k <= n; k ++) {
		for (int i = 1; i <= n; i ++) {
			for (int j = 1; j <= n; j ++) {
				d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
			}
		}
	}
}

int main() {
	cin >> n;

	rep(i, 1, n)
		rep(j, 1, n)
			d[i][j] = (i == j?0:INF);

	rep (i, 1, n) {
		int a, b, k;
		string t;
		cin >> t >> k;
		sex[i] = (t == "F"?0 :1);
		rep (j, 1, k) {
			scanf("%d:%d", &a, &b);
			d[i][a] = min(d[i][a], b);
		}
	}

	floyd();

	vector<pair<double, int>> fx, mx;

	// auto cmp = [](auto a, auto b) {
	// 	return a.f > b.f;
	// };

	rep (i, 1, n) {
		int md = -1;
		rep (j, 1, n) {
			if (sex[i] == sex[j]) continue;
			md = max(md, d[j][i]);
		}
		if (!sex[i]) fx.push_back({md, i});
		else mx.push_back({md, i});
	}
	
	sort(fx.begin(), fx.end());
	sort(mx.begin(), mx.end());

// 	for (auto& v: mx) {
// 		cout << v.f << " " << v.s << endl;
// 	}
	
	for (int i = 0; i < fx.size(); i ++) {
		if (!i) cout << fx[i].s;
		else if (fx[i].f == fx[i - 1].f) cout << " " << fx[i].s;
		else break;
	}
	cout << endl;
	for (int i = 0; i < mx.size(); i ++) {
		if (!i) cout << mx[i].s;
		else if (mx[i].f == mx[i - 1].f) cout << " " << mx[i].s;
		else break;
	}
}
posted on 2022-12-21 22:19  Jack404  阅读(201)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3