社区讨论

单纯用分数规划

P3705[SDOI2017] 新生舞会参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lxgvs2q4
此快照首次捕获于
2024/06/16 09:41
2 年前
此快照最后确认于
2024/06/16 11:56
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
int n, vis[100][2];
struct node {
	double a, b;
	int  i, j;
} p[10001];
double l, r, mid;
bool cmp(node a, node b) {
	return (a.a * 1.00 - mid * a.b) > (b.a * 1.00 - mid * b.b);
}
int main() {
	cin >> n;
	rep(i, 1, n)
	rep(j, 1, n) {
		p[(i - 1)*n + (j - 1) + 1].i = i;
		p[(i - 1)*n + (j - 1) + 1].j = j;

	}
	rep(i, 1, n) rep(j, 1, n) cin >> p[(i - 1)*n + (j - 1) + 1].a;
	rep(i, 1, n) rep(j, 1, n) cin >> p[(i - 1)*n + (j - 1) + 1].b;
	l = -2e9, r = 2e9;
	while (r - l >= 1e-10) {
		mid = (l + r) / 2;
		sort(p + 1, p + 1 + n * n, cmp);
		memset(vis, 0, sizeof vis);
		double f = 0;
		for (int i = 1; i <= n * n; i++) {
			if (vis[p[i].i][0] || vis[p[i].j][1]) continue;
			f += (p[i].a * 1.00 - mid * p[i].b * 1.00);
			vis[p[i].i][0] = vis[p[i].j][1] = 1;
		}
		if (f >=0) l = mid;
		else r = mid;
	}
	printf("%.6lf", r+0.999);
}

回复

0 条回复,欢迎继续交流。

正在加载回复...