4819: [Sdoi2017]新生舞会

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 1031  Solved: 530
[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]求出一种方案,再手动对方案进行微调。C
athy找到你,希望你帮她写那个程序。一个方案中有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]。
1<=n<=100,1<=a[i][j],b[i][j]<=10^4
 

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

分析

首先是分数规划,然后用费用流判断。

$c=\frac{a_1+a_2+...+a_k}{b_1+b_2+...+b_k}$

二分c,如果c满足条件,那么$a_1+a_2+...+a_k \geq c*(b_1+b_2+...+b_k)$

在转化一下$(a_1-c*b_1)+(a_2-c*b_2)...+(a_k-c*b_k) \geq 0$

那么如果选i,j,他们的贡献就是a[i][j]-c*b[i][j],建图跑最大费用流即可。

可以把贡献取负,然后跑最小流。

注意要开double的变量

code

 #include<cstdio>
#include<algorithm>
#include<cstring> using namespace std; const int N = ;
const int INF = 1e9;
const double eps = 1e-; struct Edge{
int from,to,nxt,cap;double cost;
}e[];
int head[N],q[],pre[N];
bool vis[N];
int tot = ,n,m,S,T;
int a[N][N],b[N][N];
double dis[N]; void add_edge(int u,int v,int cap,double cost) {
e[++tot].from = u;e[tot].to = v;e[tot].cap = cap;e[tot].cost = cost;e[tot].nxt = head[u];head[u] = tot;
e[++tot].from = v;e[tot].to = u;e[tot].cap = ;e[tot].cost = -cost;e[tot].nxt = head[v],head[v] = tot;
}
void Clear() {
tot = ;
memset(head,,sizeof(head));
}
bool spfa() {
for (int i=; i<=T; ++i)
dis[i] = INF,vis[i] = false;
dis[S] = ;vis[S] = true;pre[S] = ;
int L = ,R = ;
q[++R] = S;
while (L <= R) {
int u = q[L++];
for (int i=head[u]; i; i=e[i].nxt) {
int v = e[i].to;
if (e[i].cap && dis[v]-(dis[u]+e[i].cost)>=eps) {
dis[v] = dis[u] + e[i].cost;
pre[v] = i;
if (!vis[v]) q[++R] = v,vis[v] = true;
}
}
vis[u] = false;
}
if (dis[T] == INF) return false;
return true;
}
double MincostMaxflow() { // 返回double
double Mincost = ; // double类型
while (spfa()) {
int minflow = INF;
for (int i=T; i!=S; i=e[pre[i]].from)
minflow = min(minflow,e[pre[i]].cap);
for (int i=T; i!=S; i=e[pre[i]].from) {
e[pre[i]].cap -= minflow;
e[pre[i] ^ ].cap += minflow;
}
Mincost += minflow * dis[T];
}
return Mincost;
}
bool check(double x) {
Clear();
for (int i=; i<=n; ++i) add_edge(S,i,,);
for (int i=; i<=n; ++i) add_edge(i+n,T,,);
for (int i=; i<=n; ++i)
for (int j=; j<=n; ++j)
add_edge(i,j+n,,-(a[i][j]-1.0*x*b[i][j]));
double ans = MincostMaxflow();
return ans <= ;
}
int main () {
scanf("%d",&n);
for (int i=; i<=n; ++i)
for (int j=; j<=n; ++j)
scanf("%d",&a[i][j]);
for (int i=; i<=n; ++i)
for (int j=; j<=n; ++j)
scanf("%d",&b[i][j]);
S = n*+;T = n*+;
double L = 0.0,R = 10000.0,ans;
while (R-L >= eps) {
double mid = (L + R) / ;
if (check(mid)) ans = mid,L = mid;
else R = mid;
}
printf("%.6lf",ans);
return ;
}

4819: [Sdoi2017]新生舞会(分数规划)的更多相关文章

  1. 4819: [Sdoi2017]新生舞会 分数规划

    题目 https://www.lydsy.com/JudgeOnline/problem.php?id=4819 思路 分数规划的模板题?(好菜呀) 假如n=3吧(懒得写很长的式子) \(c=\fra ...

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

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

  3. 【bzoj4819】[Sdoi2017]新生舞会 分数规划+费用流

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

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

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

  5. P3705 [SDOI2017]新生舞会 分数规划 费用流

    #include <algorithm> #include <iterator> #include <iostream> #include <cstring& ...

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

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

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

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

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

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

  9. bzoj 4819: [Sdoi2017]新生舞会

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

随机推荐

  1. 1269 匈牙利游戏 2012年CCC加拿大高中生信息学奥赛

    1269 匈牙利游戏 2012年CCC加拿大高中生信息学奥赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond         题目描述 Description ...

  2. python+selenium之自动生成excle,保存到指定的目录下

    进行之自动化测试,想把自动生成的excle保存到指定的目录下.网上百度的代码如下: import xlwt import time time = time.strftime ('%Y%m%d%H%M% ...

  3. linux 命令——6 rmdir(转)

    今天学习一下linux中命令: rmdir命令.rmdir是常用的命令,该命令的功能是删除空目录,一个目录被删除之前必须是空的.(注意,rm - r dir命令可代替rmdir,但是有很大危险性.)删 ...

  4. ZOJ-1654 Place the Robots---二分图最小点覆盖+构图

    题目链接: https://vjudge.net/problem/ZOJ-1654 题目大意: 有一个N*M(N,M<=50)的棋盘,棋盘的每一格是三种类型之一:空地.草地.墙.机器人只能放在空 ...

  5. vim 编辑器的使用方法

    vim 命令模式       默认打开文件为命令模式 命令行模式     shift+: 命令行模式 编辑模式       i 编辑模式 Esc 切换命令模式 命令模式 -----字符操作 i   当 ...

  6. Portal简介

    Portal 在英语中是入口的意思.Portal 认证通常也称为 Web 认证,一般将 Portal 认 证网站称为门户网站. 未认证用户上网时,设备强制用户登录到特定站点,用户可以免费访问其中的服务 ...

  7. python_76_json与pickle反序列化2

    import pickle def say(name):#序列化时用完会释放,要想反序列化,要重新写上该函数,否则会出错 print('我的高中:', name)#可以和之前的序列化函数不同 f=op ...

  8. python查看安装包

    D:\Python27\Scripts>pip listbackports.ssl-match-hostname (3.4.0.2)basicauth (0.2)certifi (14.5.14 ...

  9. C#Aspose操作Word & Excel简版(后会研究补充更多功能)

    利用Aspose操作Word & Excel首先要在项目中标引用Aspose.Words.dll和Aspose.Cells.dll. 首先说一说向Word中写入数据,目前做的是向Word中的标 ...

  10. java实现单链表归并算法

    public class LinkMergeSort {static int number=0;public static void main(String[] args) {int[] a = {1 ...