[BZOJ 4819] [SDOI 2017] 新生舞会
Description
学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴。
有 \(n\) 个男生和 \(n\) 个女生参加舞会买一个男生和一个女生一起跳舞,互为舞伴。
Cathy收集了这些同学之间的关系,比如两个人之前认识没计算得出 \(a_{i,j}\)。
Cathy还需要考虑两个人一起跳舞是否方便,比如身高体重差别会不会太大,计算得出 \(b_{i,j}\),表示第 \(i\) 个男生和第 \(j\) 个女生一起跳舞时的不协调程度。
当然,还需要考虑很多其他问题。
Cathy想先用一个程序通过 \(a_{i,j}\) 和 \(b_{i,j}\) 求出一种方案,再手动对方案进行微调。
Cathy找到你,希望你帮她写那个程序。
一个方案中有n对舞伴,假设没对舞伴的喜悦程度分别是 \(a'_1,a'_2,...,a'_n\),假设每对舞伴的不协调程度分别是 \(b'_1,b'_2,...,b'_n\)。令
\]
Cathy希望 \(C\) 值最大。
Input
第一行一个整数 \(n\)。
接下来 \(n\) 行,每行 \(n\) 个整数,第 \(i\) 行第 \(j\) 个数表示 \(a_{i,j}\)。
接下来 \(n\) 行,每行 \(n\) 个整数,第 \(i\) 行第 \(j\) 个数表示 \(b_{i,j}\)。
Output
一行一个数,表示 \(C\) 的最大值。四舍五入保留 \(6\) 位小数,选手输出的小数需要与标准输出相等。
Sample Input
3
19 17 16
25 24 23
35 36 31
9 5 6
3 4 2
7 8 9
Sample Output
5.357143
HINT
对于10%的数据,\(1\le n\le 5\)
对于40%的数据,\(1\le n\le 18\)
另有20%的数据,\(b_{i,j}\le 1\)
对于100%的数据,\(1\le n\le 100,1\le a_{i,j},b_{i,j}<=10^4\)
Solution
分数规划,二分答案 \(mid\),将边的费用设为 \(b_{i,j}\cdot mid-a_{i,j}\),若最小费用 \(>0\),则令 \(r=mid\),否则令 \(l=mid\)。
注意 \(1e9+1e^{-8}\) 会爆 \(double\) 的精度,所以避免写 \(\inf+eps\)。
Code
#include <queue>
#include <cstdio>
#include <algorithm>
const double eps = 1e-8, INF = 1e8;
int n, a[102][102], b[102][102], head[205], tot = 1, S, T, p[205], c[205]; double d[205];
struct Edge {
int u, v, nxt, f, c; double w; Edge(){}
Edge(int u, int v, int nxt, int f, int c, double w) : u(u), v(v), nxt(nxt), f(f), c(c), w(w) {}
} e[20402];
int read() {
int x = 0; char c = getchar();
while (c < '0' || c > '9') c = getchar();
while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();
return x;
}
void adde(int u, int v) {
e[++tot] = Edge(u, v, head[u], 0, 1, 0), head[u] = tot;
e[++tot] = Edge(v, u, head[v], 0, 0, 0), head[v] = tot;
}
bool spfa(int &flow, double &cost) {
int inq[205] = {}, u; std::queue<int> q;
for (int i = 1; i <= T; ++i) d[i] = INF;
d[S] = p[S] = 0, q.push(S), inq[S] = 1, c[S] = INF;
while (!q.empty()) {
u = q.front(), q.pop(), inq[u] = 0;
for (int i = head[u]; i; i = e[i].nxt)
if (e[i].c > e[i].f && d[e[i].v] > d[u] + e[i].w + eps) {
d[e[i].v] = d[u] + e[i].w, p[e[i].v] = i, c[e[i].v] = std::min(c[u], e[i].c - e[i].f);
if (!inq[e[i].v]) q.push(e[i].v), inq[e[i].v] = 1;
}
}
if (d[T] + 1 > INF) return false;
flow += c[T], cost += c[T] * d[T], u = T;
while (u != S) e[p[u]].f += c[T], e[p[u] ^ 1].f -= c[T], u = e[p[u]].u;
return true;
}
double mcmf() {
int flow = 0; double cost = 0;
while (spfa(flow, cost)) {}
return cost;
}
int main() {
n = read(), S = n << 1 | 1, T = S + 1;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j) a[i][j] = read();
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j) b[i][j] = read();
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j) adde(i, n + j);
for (int i = 1; i <= n; ++i) adde(S, i), adde(n + i, T);
double l = 0, r = 10000, mid;
while (l + eps < r) {
mid = (l + r) / 2;
for (int i = 1, k = 0; i <= n; ++i)
for (int j = 1; j <= n; ++j) k += 2, e[k].w = mid * b[i][j] - a[i][j], e[k ^ 1].w = a[i][j] - mid * b[i][j];
for (int i = 2; i <= tot; ++i) e[i].f = 0;
if (mcmf() > eps) r = mid; else l = mid;
}
printf("%.6lf", l);
return 0;
}
[BZOJ 4819] [SDOI 2017] 新生舞会的更多相关文章
- [SDOI 2017]新生舞会
Description 题库链接 给你个 \(2\times N\) 的带权二分图,两个权值 \(a,b\) ,让你做匹配使得 \[\frac{\sum a}{\sum b}\] 最大. \(1\le ...
- [BZOJ 4817] [SDOI 2017] 树点涂色
Description Bob有一棵 \(n\) 个点的有根树,其中 \(1\) 号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是:这条路径上的点(包括起点和终点 ...
- [BZOJ 4818] [SDOI 2017] 序列计数
Description Alice想要得到一个长度为 \(n\) 的序列,序列中的数都是不超过 \(m\) 的正整数,而且这 \(n\) 个数的和是 \(p\) 的倍数. Alice还希望,这 \(n ...
- bzoj 5110 Yazid的新生舞会
题目大意: 一个数列,求有多少个区间$[l,r]$满足该区间的众数出现次数大于$\lceil \frac{r-l}{2} \rceil$ 思路: 对于一个区间满足条件的众数明显是唯一的 所以设该数的前 ...
- 【BZOJ 4819】 4819: [Sdoi2017]新生舞会 (0-1分数规划、二分+KM)
4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 601 Solved: 313 Description 学校 ...
- bzoj 4819: [Sdoi2017]新生舞会
Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间 ...
- 4819: [Sdoi2017]新生舞会(分数规划)
4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1031 Solved: 530[Submit][Statu ...
- BZOJ4819 新生舞会
4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec Memory Limit: 128 MB Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学 ...
- 【BZOJ4819】新生舞会(分数规划,网络流)
[BZOJ4819]新生舞会(分数规划,网络流) 题面 BZOJ Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买 ...
随机推荐
- css中“~”和“>”
css中“~” element1~element2 选择器匹配 出现在 element1 后面的 element2 .element1 和 element2 这两种元素必须具有相同的父元 ...
- Vue脚手架搭建项目
全局安装vue脚手架 $ npm install -g vue-cli 卸载方法 $ npm uninstall -g vue-cli 查看vue版本(注意:大写的V) $ vue -V 创建项目 $ ...
- 解决ViewGroup不调用onDraw()的问题
今天在做项目的时候自定义了一个View,继承了LinearLayout,结果,里面的onDraw()方法一直无法被调用. 后来发现ViewGroup是默认不调用onDraw()方法的. 原因我们暂且不 ...
- 性能测试 基于Python结合InfluxDB及Grafana图表实时采集Linux多主机性能数据
基于Python结合InfluxDB及Grafana图表实时采集Linux多主机性能数据 by:授客 QQ:1033553122 实现功能 测试环境 环境搭建 使用前提 使用方法 运行程序 效果展 ...
- 章节九、2-使用firefoxdriver浏览器进行自动化测试
一.演示如何使用火狐浏览器打开“百度” package basicweb; import org.openqa.selenium.WebDriver; import org.openqa.seleni ...
- Django 事务操作
如何在Django中进行事务操作 案例: 客户A要给客户B转一笔钱,这个在数据库中需要进行两步: 1.客户A减钱 2.客户B加钱 如果在第一步结束后,服务器出现异常,停下了,第二步没有进行,如果数据库 ...
- Python3漏洞扫描工具 ( Python3 插件式框架 )
目录 Python3 漏洞检测工具 -- lance screenshot requirements 关键代码 usage documents README Guide Change Log TODO ...
- 宇宙第一开发工具:vs2019 开发Python
1.初步认识 现在人工智能逐步进入人们的视野,人工智能开发也越来越火. 而python语言,被作为大数据库开发的首选语言之一~.前一段时间vs2019预览版发布.相信不少小伙伴已经开始使用,vs201 ...
- c/c++ 继承与多态 容器与继承1
问题:类B公有继承类A,类A有虚函数fun,类B覆盖了虚函数fun,有一个std::vector<A>,添加A的对象a,和B的对象b,到这个容器里,然后从vector里取出来,使用对象a. ...
- PyCharm使用小技巧
本文部分内容参考了明宇李前辈的博客,原文请阅读 Pycharm的配置(背景颜色,字体,解释器等): 鼠标滑轮控制字体大小 部分参考了墨颜前辈的博客,原文请阅读 用鼠标滑轮控制代码字体大小: 感谢各位前 ...