4819: [Sdoi2017]新生舞会(分数规划)
4819: [Sdoi2017]新生舞会
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 1031 Solved: 530
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
19 17 16
25 24 23
35 36 31
9 5 6
3 4 2
7 8 9
Sample Output
分析
首先是分数规划,然后用费用流判断。
$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]新生舞会(分数规划)的更多相关文章
- 4819: [Sdoi2017]新生舞会 分数规划
题目 https://www.lydsy.com/JudgeOnline/problem.php?id=4819 思路 分数规划的模板题?(好菜呀) 假如n=3吧(懒得写很长的式子) \(c=\fra ...
- [BZOJ4819][SDOI2017]新生舞会(分数规划+费用流,KM)
4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1097 Solved: 566[Submit][Statu ...
- 【bzoj4819】[Sdoi2017]新生舞会 分数规划+费用流
题目描述 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间的关系,比如两个 ...
- bzoj4819 [Sdoi2017]新生舞会 分数规划+最大费用最大流
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4819 题解 首先上面说, \[ C = \frac{\sum\limits_{i=1}^n a ...
- P3705 [SDOI2017]新生舞会 分数规划 费用流
#include <algorithm> #include <iterator> #include <iostream> #include <cstring& ...
- 【BZOJ 4819】 4819: [Sdoi2017]新生舞会 (0-1分数规划、二分+KM)
4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 601 Solved: 313 Description 学校 ...
- BZOJ.4819.[SDOI2017]新生舞会(01分数规划 费用流SPFA)
BZOJ 洛谷 裸01分数规划.二分之后就是裸最大费用最大流了. 写的朴素SPFA费用流,洛谷跑的非常快啊,为什么有人还T成那样.. 当然用二分也很慢,用什么什么迭代会很快. [Update] 19. ...
- BZOJ 4819 [Sdoi2017]新生舞会 ——费用流 01分数规划
比值最大 分数规划 二分答案之后用费用流进行验证. 据说标称强行乘以1e7换成了整数的二分. 不过貌似实数二分也可以过. #include <map> #include <cmath ...
- bzoj 4819: [Sdoi2017]新生舞会
Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女生一起跳舞,互为舞伴.Cathy收集了这些同学之间 ...
随机推荐
- webpack.config.js====引入Jquery库文件
1. 安装 cnpm install --save jquery expose-loader 2. 在webpack.config.js中配置 Jquery库是使用的webpack的一个插件Provi ...
- hibernate课程 初探单表映射2-7 hbm配置文件常用设置
本节主要简介hbm配置文件以下内容: 1 mapping标签 2 class标签 3 id标签 1 hibbernate-mapping标签 schema 模式名称 catalog 目录名称 defa ...
- hibernate课程 初探单表映射1-8 hibernate持久化类
java beans 的设计原则 1 公有的类 2 共有不带参数构造方法 3 私有属性 4 属性setter/getter方法 Studnet类: package com.ddwei.student; ...
- Linux常用操作2
第1章 find命令扩展 转自:https://www.cnblogs.com/clsn/p/7520333.html 1.1 方法一 |xargs 通过|xargs将前面命令的执行结果传给后面. [ ...
- Yii2.0 高级版安装 windows
最近在学习yii2.0 在安装高级版的时候遇到一些问题 索性解决了 下面分享一下 一.关于下载 自行百度,在Yii Framework 中文社区 下载专区下载高级应用程序模板(这边下载用电信网络不用下 ...
- Android 浮动按钮的伸缩效果
在做项目时想增加点动感,于是就有如下效果: 实现起来也很简单,通过属性动画和recyclerview 滑动结合就很好实现了. 通过给recycleview添加一个滑动监听:通过滚动的差值来处理动画 m ...
- unity中的动画制作方法
Unity中的动画制作方法 1.DOTween DoTween在5.0版本中已经用到了,到官网下载好插件之后,然后通过在项目中导入头using DG.Tweening;即可. 一些常用的API函数 D ...
- 《译》准备做一些 AR/增强现实的 翻译
中文这方面资料实在少之又少. 准备做一些这方面翻译,关注于Vuforia, Unity3d, Hololens等方面. 如有问题.建议,随时联系.Fell free ton contact me.
- Linux最常用命令实战
1.改变机器的名称: vim /etc/hostname Master 在文件中修改机器名称为我们想要的名称(相当于域名) 可以通过shutdown -h now 关闭 2.查看当前机器IP: ifc ...
- pta 编程题20 旅游规划
其它pta数据结构编程题请参见:pta 题目 这个最短路径问题只需要求两点之间的最短路径,因而在Dijikstra算法中当求出目标点的最短路径之后跳出循环即可. #include <iostre ...