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. 安卓adb调试命令常见的问题

    首先本人使用的是ubuntu系统,在Eclipse下开发的时候使用无线调试,在终端直接输入adb connect 114.114.114.114没有问题,给手机安装软件用adb install  ** ...

  2. 我对USB的认识

    一.USB协议规范 (1)      基本概念   每一个设备(device)会有一个或者多个的逻辑连接点在里面,每个连接点叫endpoint.每个endpoint有四种数据传送方式:控制(Contr ...

  3. CF1136D Nastya Is Buying Lunch

    思路: 1. 最终答案不超过能与Nastya“直接交换”的人数. 2. 对于排在j前面的i,如果i和i-j之间(包括j)的每个人都能“直接交换”,j才能前进一步. 实现: #include <b ...

  4. mysql配置jdbc

    jdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/database?useUnicode=t ...

  5. 在LINUX系统中MySQL数据库区分表名的大小写--解决办法

    因为linux下mysql默认是要区分表名大小写的.mysql是否区分大小写设置是由参数lower_case_table_names决定的, 其中:1)lower_case_table_names = ...

  6. 【转】Nginx跳转任意Http请求到Https

    网站买了证书,绿条,多霸气! 那么自然得拦截http的访问方式了. 拦截http,301到https 各种Google,最后在Nginx官网找到例子,配置很简单,如下: server { listen ...

  7. C++中调用Python脚本(转载)

    转载▼ 标签: 杂谈 C++中调用Python脚本的意义就不讲了,至少你可以把它当成文本形式的动态链接库,需要的时候还可以改一改,只要不改变接口, C++的程序一旦编译好了,再改就没那么方便了先看Py ...

  8. linux 命令——53 route(转)

    Linux系统的route 命令用于显示和操作IP路由表(show / manipulate the IP routing table).要实现两个不同的子网之间的通信,需 要一台连接两个网络的路由器 ...

  9. linux 命令——9 touch (转)

    linux的touch命令不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件. 1.命令格式: touch [选项]... 文件... 2.命令参数: -a    ...

  10. log4j.properties中的这句话“log4j.logger.org.hibernate.SQL=DEBUG ”该怎么写在log4j.xml里面呢?

    http://www.cnblogs.com/gredswsh/p/log4j_xml_properties.html 请问:log4j.properties中的这句话“log4j.logger.or ...