新生舞会

Time Limit: 10 Sec  Memory Limit: 128 MB
[Submit][Status][Discuss]

Description

  学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴。有n个男生和n个女生参加舞会买一个男生和一个女生一起跳舞,互为舞伴。
  Cathy收集了这些同学之间的关系,比如两个人之前认识没计算得出 a[i][j] ,表示第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。
  令C=(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

  1<=n<=100,1<=a[i][j],b[i][j]<=10^4

Main idea

  选择两个人<i,j>会获得A[i][j],以及B[i][j],选择后不能再选,要求使得ΣA[i][j]/ΣB[i][j]最大。

Solution

  最大费用最大流的话,可以把权值取相反数,然后跑最小费用最大流

Code

 #include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
typedef long long s64; const int ONE = ;
const int EDG = ;
const double eps = 1e-;
const int INF = ; int n,m;
int A[ONE][ONE],B[ONE][ONE];
int next[EDG],first[ONE],go[EDG],from[EDG],pas[EDG],tot;
int vis[ONE],q[],pre[ONE],tou,wei;
double w[EDG],dist[ONE];
int S,T;
double Ans; inline int get()
{
int res=,Q=; char c;
while( (c=getchar())< || c>)
if(c=='-')Q=-;
if(Q) res=c-;
while((c=getchar())>= && c<=)
res=res*+c-;
return res*Q;
} int Add(int u,int v,int flow,double z)
{
next[++tot]=first[u]; first[u]=tot; go[tot]=v; pas[tot]=flow; w[tot]=z; from[tot]=u;
next[++tot]=first[v]; first[v]=tot; go[tot]=u; pas[tot]=; w[tot]=-z; from[tot]=v;
} bool Bfs()
{
for(int i=S;i<=T;i++) dist[i]=INF;
tou = ; wei = ;
q[] = S; vis[S] = ; dist[S] = ;
while(tou < wei)
{
int u = q[++tou];
for(int e=first[u];e;e=next[e])
{
int v=go[e];
if(dist[v] > dist[u]+w[e] && pas[e])
{
dist[v] = dist[u]+w[e]; pre[v] = e;
if(!vis[v])
{
q[++wei] = v;
vis[v] = ;
}
}
}
vis[u] = ;
}
return dist[T] != INF;
} double Deal()
{
int x = INF;
for(int e=pre[T]; go[e]!=S; e=pre[from[e]]) x = min(x,pas[e]);
for(int e=pre[T]; go[e]!=S; e=pre[from[e]])
{
pas[e] -= x;
pas[((e-)^)+] += x;
Ans += w[e]*x;
}
} int Check(double ans)
{
memset(first,,sizeof(first)); tot=;
S=; T=*n+;
for(int i=;i<=n;i++)
{
Add(S,i,,);
for(int j=;j<=n;j++)
Add(i,j+n, ,-(A[i][j] - ans*B[i][j]));
Add(i+n,T,,);
} Ans = ;
while(Bfs()) Deal();
return -Ans >= eps;
} int main()
{
n=get();
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
A[i][j] = get();
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
B[i][j] = get(); double l = , r = 1e4;
while(l < r - 1e-)
{
double mid = (l+r)/2.0;
if(Check(mid)) l = mid;
else r = mid;
} if(Check(r)) printf("%.6lf", r);
else printf("%.6lf", l);
}

【BZOJ4819】【SDOI2017】新生舞会 [费用流][分数规划]的更多相关文章

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

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

  2. 【BZOJ 4819】 4819: [Sdoi2017]新生舞会 (0-1分数规划、二分+KM)

    4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 601  Solved: 313 Description 学校 ...

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

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

  4. BZOJ 4819 [Sdoi2017]新生舞会 ——费用流 01分数规划

    比值最大 分数规划 二分答案之后用费用流进行验证. 据说标称强行乘以1e7换成了整数的二分. 不过貌似实数二分也可以过. #include <map> #include <cmath ...

  5. [SDOI2017]新生舞会 0/1分数规划

    ---题面--- 题解: 0/1分数规划,,,但是竟然有诡异的精度问题???因为这个被卡了好久 中途还写过一次KM,,,结果陷入死循环,,,我大概是写了一个假KM,,,于是放弃KM,回来调费用流 这个 ...

  6. 洛谷3705 [SDOI2017] 新生舞会 【01分数规划】【KM算法】

    题目分析: 裸题.怀疑$ O(n^4log{n}) $跑不过,考虑Edmonds-Karp优化. 代码: #include<bits/stdc++.h> using namespace s ...

  7. [BZOJ4819][SDOI2017]新生舞会(分数规划+费用流,KM)

    4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1097  Solved: 566[Submit][Statu ...

  8. bzoj4819 [Sdoi2017]新生舞会 分数规划+最大费用最大流

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4819 题解 首先上面说, \[ C = \frac{\sum\limits_{i=1}^n a ...

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

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

随机推荐

  1. ACM 第五天

    匈牙利算法(二分图匹配) C - Courses Consider a group of N students and P courses. Each student visits zero, one ...

  2. css那些事儿1 css选择符与管理

    结合当下作为一名net程序员,难以找到工作情况下,先学习前端知识,前端现在已成为web和app的一个交叉点,web前端化,app使用h5技术前端化,至于什么后台数据库 缓存 消息队列的路线如果没有大型 ...

  3. HDU 1995 R-汉诺塔V

    https://vjudge.net/contest/67836#problem/R 用1,2,...,n表示n个盘子,称为1号盘,2号盘,....号数大盘子就大.经典的汉诺塔问 题经常作为一个递归的 ...

  4. 【Docker 命令】- pull命令

    docker pull : 从镜像仓库中拉取或者更新指定镜像 语法 docker pull [OPTIONS] NAME[:TAG|@DIGEST] OPTIONS说明: -a :拉取所有 tagge ...

  5. 主流 Kubernetes 发行版梳理

    2014 年,Kubernetes 作为内部 Google orchestrator Borg 开源版本推出,目前已是最成功和发展最快的 IT 基础架构项目之一.2018 年,Kubernetes 已 ...

  6. 【转】log4j.properties文件的配置

    一.前言 log4j使用的还是比较多的,但是对于其配置又很难描述清楚要怎么配置,说明我自己对于log4j的配置并不是非常熟悉,所以在网上找了一篇详尽的 博文转载,在此非常感谢原文作者的辛苦付出,如有需 ...

  7. 为什么 MongoDB (索引)使用B-树而 Mysql 使用 B+树

    B-树由来 定义:B-树是一类树,包括B-树.B+树.B*树等,是一棵自平衡的搜索树,它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点.B-树是专门为外部存储器设计的,如磁盘,它对 ...

  8. Keil MDK中Image~~RW_IRAM1~~ZI~~Limit(~表示$)

    ARM程序的组成 此处所说的“ARM程序”是指在ARM系统中正在执行的程序,而非保存在ROM中的bin映像(image)文件,这一点清注意区别.            一个ARM程序包含3部分:RO, ...

  9. C++ 类中成员函数分析

    概述之前对成员变量的分布进行了整理,今天就对成员函数进行整理. 1.非静态成员函数C++的设计准则之一就是:非静态成员函数至少和一般的非成员函数的执行效率相同. 为了实现上衣准则,编译器会对非静态成员 ...

  10. Android中WebView的跨域漏洞分析和应用被克隆问题情景还原(免Root获取应用沙盒数据)

    一.前言 去年年底支付宝的被克隆漏洞被爆出,无独有偶就是腾讯干的,其实真正了解这个事件之后会发现,感觉是针对支付宝.因为这个漏洞找出肯定花费了很大劲,主要是因为支付宝的特殊业务需要开启了WebView ...