$ \color{#0066ff}{ 题目描述 }$

学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴。

有\(n\)个男生和\(n\)个女生参加舞会买一个男生和一个女生一起跳舞,互为舞伴。

Cathy收集了这些同学之间的关系,比如两个人之前认识没计算得出 \(a_{i,j}\)

Cathy还需要考虑两个人一起跳舞是否方便,比如身高体重差别会不会太大,计算得出 \(b_{i,j}\),表示第i个男生和第j个女生一起跳舞时的不协调程度。

当然,还需要考虑很多其他问题。

Cathy想先用一个程序通过\(a_{i,j}\)和\(b_{i,j}\),j求出一种方案,再手动对方案进行微调。

Cathy找到你,希望你帮她写那个程序。

一个方案中有n对舞伴,假设没对舞伴的喜悦程度分别是\(a'_1,a'_2,...,a'_n\),假设每对舞伴的不协调程度分别是\(b'_1,b'_2,...,b'_n\)。令

\(C=\frac{a'_1+a'_2+...+a'_n}{b'_1+b'_2+...+b'_n}\)

Cathy希望C值最大。

\(\color{#0066ff}{输入格式}\)

第一行一个整数n。

接下来n行,每行n个整数,第i行第j个数表示\(a_{i,j}\)。

接下来n行,每行n个整数,第i行第j个数表示\(b_{i,j}\)。

\(\color{#0066ff}{输出格式}\)

一行一个数,表示C的最大值。四舍五入保留6位小数,选手输出的小数需要与标准输出相等。

\(\color{#0066ff}{输入样例}\)

3
19 17 16
25 24 23
35 36 31
9 5 6
3 4 2
7 8 9

\(\color{#0066ff}{输出样例}\)

5.357143

\(\color{#0066ff}{数据范围与提示}\)

对于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\)

\(\color{#0066ff}{题解}\)

很显然这是个01分数规划, 二分答案就行

考虑二分完之后咋整,要是新权值和最小(大), 二人一一对应, 用费用流就行了

注意二分范围
#include<bits/stdc++.h>
#define LL long long
LL in() {
char ch; LL x = 0, f = 1;
while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
return x * f;
}
const double eps = 1e-8;
const int maxn = 1e5 + 100;
const int maxm = 1020;
const int inf = 0x7fffffff;
int n, s, t;
struct node {
int to, can;
double dis;
node *nxt, *rev;
node(int to = 0, int can = 0, double dis = 0, node *nxt = NULL): to(to), can(can), dis(dis), nxt(nxt) { rev = NULL; }
}pool[maxn], *tail;
node *head[maxm];
bool vis[maxm];
double dis[maxm];
int a[maxm][maxm], b[maxm][maxm];
void init() {
for(int i = s; i <= t; i++) head[i] = NULL;
tail = pool;
}
void add(int from, int to, int can, double dis) {
head[from] = new(tail++) node(to, can, dis, head[from]);
}
void link(int from, int to, int can, double dis) {
add(from, to, can, dis), add(to, from, 0, -dis);
(head[from]->rev = head[to])->rev = head[from];
}
bool spfa() {
for(int i = s; i <= t; i++) vis[i] = false, dis[i] = 1e15;
std::deque<int> q;
dis[t] = 0;
q.push_back(t);
while(!q.empty()) {
int tp = q.front(); q.pop_front();
vis[tp] = false;
for(node *i = head[tp]; i; i = i->nxt) {
if(dis[i->to] - (dis[tp] - i->dis) > eps && i->rev->can) {
dis[i->to] = dis[tp] - i->dis;
if(!vis[i->to]) {
vis[i->to] = true;
if(!q.empty() && dis[q.front()] - dis[i->to] > eps) q.push_front(i->to);
else q.push_back(i->to);
}
}
}
}
return 1e15 - dis[s] > eps;
}
int dfs(int x, int change) {
if(x == t || !change) return change;
vis[x] = true;
int flow = 0, ls;
for(node *i = head[x]; i; i = i->nxt) {
if(!vis[i->to] && fabs(dis[i->to] - (dis[x] - i->dis)) <= eps && (ls = dfs(i->to, std::min(change, i->can)))) {
change -= ls;
flow += ls;
i->rev->can += ls;
i->can -= ls;
if(!change) break;
}
}
return flow;
}
double zkw() {
double cost = 0;
while(spfa()) {
vis[t] = true;
while(vis[t]) {
for(int i = s; i <= t; i++) vis[i] = false;
cost += 1.0 * dfs(s, inf) * dis[s];
}
}
return cost;
}
bool ok(double mid) {
s = 0, t = 2 * n + 1;
init();
for(int i = 1; i <= n; i++) link(s, i, 1, 0), link(i + n, t, 1, 0);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
link(i, j + n, 1, (double)(mid * b[i][j] - 1.0 * a[i][j]));
return zkw() <= -eps;
} int main() {
n = in();
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
a[i][j] = in();
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
b[i][j] = in();
double l = 0, r = 1e5, ans = 0;
while(r - l >= eps) {
double mid = (l + r) / 2.0;
if(ok(mid)) ans = mid, l = mid;
else r = mid;
}
printf("%.6f\n", ans);
return 0;
}

P3705 [SDOI2017]新生舞会 01分数规划+费用流的更多相关文章

  1. 【BZOJ4819】[Sdoi2017]新生舞会 01分数规划+费用流

    [BZOJ4819][Sdoi2017]新生舞会 Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女 ...

  2. BZOJ.4819.[SDOI2017]新生舞会(01分数规划 费用流SPFA)

    BZOJ 洛谷 裸01分数规划.二分之后就是裸最大费用最大流了. 写的朴素SPFA费用流,洛谷跑的非常快啊,为什么有人还T成那样.. 当然用二分也很慢,用什么什么迭代会很快. [Update] 19. ...

  3. BZOJ_4819_[Sdoi2017]新生舞会_01分数规划+费用流

    BZOJ_4819_[Sdoi2017]新生舞会_01分数规划+费用流 Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞 ...

  4. BZOJ-4819: 新生舞会(01分数规划+费用流)

    Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间 ...

  5. [Sdoi2017]新生舞会(分数规划+费用流)

    题解:二分答案mid,然后将每个位置看成a-b*mid,然后由于是n个男生和n个女生匹配,每个人搭配一个cp,于是有点类似于https://www.lydsy.com/JudgeOnline/prob ...

  6. [Sdoi2017]新生舞会 [01分数规划 二分图最大权匹配]

    [Sdoi2017]新生舞会 题意:沙茶01分数规划 貌似\(*10^7\)变成整数更科学 #include <iostream> #include <cstdio> #inc ...

  7. BZOJ4819: [Sdoi2017]新生舞会(01分数规划)

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1029  Solved: 528[Submit][Status][Discuss] Descripti ...

  8. BZOJ4819 [Sdoi2017]新生舞会 【01分数规划 + 费用流】

    题目 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间的关系,比如两个人 ...

  9. 【BZOJ4819】 新生舞会(01分数规划,费用流)

    Solution 考虑一下这个东西的模型转换: \(\frac{\sum_{i=1}^n{a_i}}{\sum_{i=1}^n{b_i}}\) 然后转换一下发现显然是01分数规划. \(\sum_{i ...

随机推荐

  1. Directshow 采集音视频数据H264+AAC+rtmp效果还不错

    从usb摄像头或者采集卡中采集效果还是不错的.

  2. spark 中文编码处理

    日志的格式是GBK编码的,而hadoop上的编码是用UTF-8写死的,导致最终输出乱码. 研究了下Java的编码问题. 网上其实对spark输入文件是GBK编码有现成的解决方案,具体代码如下 impo ...

  3. Java多线程-线程的调度(优先级)

    与线程休眠类似,线程的优先级仍然无法保障线程的执行次序.只不过,优先级高的线程获取CPU资源的概率较大,优先级低的并非没机会执行. 线程的优先级用1-10之间的整数表示,数值越大优先级越高,默认的优先 ...

  4. Markdown使用简单示例(每一个使用对应一个实际的markdown语法)

    1.标题示例:通过"#"数量表示几级标题.(一共只有1~6级标题,1级标题字体最大) 标题一 #标题一 标题二 #标题二 标题三 ###标题三 标题四 ####标题四 标题五 ## ...

  5. leetcode:First Missing Positive分析和实现

    题目大意: 传入整数数组nums,求nums中未出现的正整数中的最小值.要求算法在O(n)时间复杂度内实现,并且只能分配常量空间. 分析: 一般碰到这种问题,都先对数组进行排序,再遍历数组就可以找到最 ...

  6. 算法描述》关于LIS的nlogn方法

    上次TYVJ有一道裸LIS,然而我当时直接打了一个N^2暴力就草草了事,然后就ZZ了,只拿了60分,其实NlogN的LIS和N^2的差的不多,只是没有N^2,好想罢了,鉴于某学弟的要求,所以就重现一下 ...

  7. ubuntu 12.04 ubuntu System program problem detected 解决方法

    1. ubuntu System program problem detected本人操作系统是ubuntu12.04,不知道是系统出了问题还是装的软件有问题,每次开机都出现:System progr ...

  8. 599. Minimum Index Sum of Two Lists两个餐厅列表的索引和最小

    [抄题]: Suppose Andy and Doris want to choose a restaurant for dinner, and they both have a list of fa ...

  9. 2-python代码坑点

    #切片: # L = ['aaa', 'bbb', 'ccc', 'ddd'] # print(L[1 : 3]) #取[1, 3):下标 # L = list(range(100)) # print ...

  10. UCOSII在STM32F407上的移植

    1.ucosii移植准备工作 1.1准备基础工程: 移植的时候需要一个基础工程,为了方便起见我们就选取跑马灯实验,作为ucossii移植的基础工程. 1.2Ucossii源码: 1)Micrium官网 ...