题目

https://www.lydsy.com/JudgeOnline/problem.php?id=4819

思路

分数规划的模板题?(好菜呀)

假如n=3吧(懒得写很长的式子)

\(c=\frac{a_1+a_2+a_3}{b_1+b_2+b_3}\)

我们先二分一下,变为判定性问题

c是否大于等于xxxx

\(c>=\frac{a_1+a_2+a_3}{b_1+b_2+b_3}\)

\((b_1+b_2+b_3)*c>=a_1+a_2+a_3\)

\(0>=(a_1-c*b_1)+(a_2-c*b_2)+(a_3-c*b_3)\)

取反跑费用流就好了

每次cnt没=1,居然T了

说:没油圈就可以取反跑费用流

代码

#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 5e5 + 7,inf=0x3f3f3f3f;
const double eps=1e-7;
int read() {
int x=0,f=1;char s=getchar();
for (;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for (;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
int n,S,T;
int a[120][119],b[110][120];
struct node {
int u,v,nxt,cap;
double cost;
}e[N];
int head[N],cnt=1;
void add_edge(int u,int v,int cap,double cost) {
e[++cnt].v=v;
e[cnt].u=u;
e[cnt].cap=cap;
e[cnt].cost=cost;
e[cnt].nxt=head[u];
head[u]=cnt;
}
void Add(int u,int v,int cap,double cost) {
add_edge(u,v,cap,cost);
add_edge(v,u,0,-cost);
}
double dis[1001];
int frm[1001];
bool vis[1001];
queue<int> q;
bool spfa() {
for(int i=0;i<=n+n;++i) dis[i]=-inf;
dis[T]=-inf;
memset(vis,0,sizeof(vis));
memset(frm,0,sizeof(frm));
q.push(S);
dis[S]=0;
while(!q.empty()) {
int u=q.front();
q.pop();
vis[u]=0;
for(int i=head[u];i;i=e[i].nxt) {
int v=e[i].v;
if(e[i].cap&&dis[v]<dis[u]+e[i].cost) {
dis[v]=dis[u]+e[i].cost;
frm[v]=i;
if(!vis[v]) vis[v]=1,q.push(v);
}
}
}
return dis[T]!=-inf;
}
double work() {
double ans=0;
while(spfa()) {
int now_flow=inf;
for(int i=frm[T];i;i=frm[e[i].u])
now_flow=min(now_flow,e[i].cap);
for(int i=frm[T];i;i=frm[e[i].u]) {
e[i].cap-=now_flow;
e[i^1].cap+=now_flow;
ans+=now_flow*e[i].cost;
}
}
return ans;
}
bool check(double c) {
memset(e,0,sizeof(e));
memset(head,0,sizeof(head));
cnt=1;
S=2*n+1,T=2*n+2;
for(int i=1;i<=n;++i) Add(S,i,1,0),Add(i+n,T,1,0);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
Add(i,j+n,1,a[i][j]-c*b[i][j]);
double tmp=work();
return tmp>=eps;//精度高了,等不等号差不多了
}
int main() {
//read
n=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
a[i][j]=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
b[i][j]=read();
double l=0,r=1e4+1,ans=0;
while(r-l>=eps) {
double mid=(l+r)/2;
if(check(mid)) ans=mid,l=mid;
else r=mid;
}
printf("%.6lf\n",ans);
return 0;
}

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

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

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

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

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

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

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

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

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

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

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

  6. 4819: [Sdoi2017]新生舞会(分数规划)

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

  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. 将Web项目War包部署到Tomcat服务器基本步骤

    参考来源: http://www.cnblogs.com/pannysp/archive/2012/03/07/2383364.html 1. 常识:   1.1 War包 War包一般是在进行Web ...

  2. html5闰年判断函数

    <script>    var year=2016;        function runnian(year){            if (year%400==0) {return ...

  3. Fabric架构:抽象的逻辑架构与实际的运行时架构

    Fabric从1.X开始,在扩展性及安全性上面有了大大的提升,且新增了诸多的新特性: 多通道:支持多通道,提高隔离安全性. 可拔插的组件:支持共识组件.权限管理组件等可拔插功能. 账本数据可被存储为多 ...

  4. MongoDB优化,建立索引实例及索引机制原理讲解

    MongoDB优化,建立索引实例及索引机制原理讲解 为什么需要索引? 当你抱怨MongoDB集合查询效率低的时候,可能你就需要考虑使用索引了,为了方便后续介绍,先科普下MongoDB里的索引机制(同样 ...

  5. max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]

    elasticsearch安装时遇到的错误 问题翻译过来就是:elasticsearch用户拥有的可创建文件描述的权限太低,至少需要65536: 解决办法: #切换到root用户修改 vim /etc ...

  6. 阿里巴巴json fastjson String转javaBean

    private Entity getEntity(String resp){        JSONObject jsonObj = (JSONObject) JSON.parse(resp);    ...

  7. [转载]CSS各种居中方法

    水平居中的text-align:center 和 margin:0 auto   这两种方法都是用来水平居中的,前者是针对父元素进行设置而后者则是对子元素.他们起作用的首要条件是子元素必须没有被flo ...

  8. GoldenGate 12.3 MA架构介绍系列(4)–Restful API介绍

    OGG 12.3 MA中最大的变化就是使用了restful api,在前面介绍的各个服务模块,其实就是引用restful api开发而来,这些API同时也提供对外的集成接口,详细接口可参考: http ...

  9. MyEclipse/Eclipse快捷键总结

    MyEclipse/Eclipse快捷键 查找某个方法被谁调用:选中方法名,ctrl+shift+g 通过文件名称查找类或文件:ctrl+shift+r(Open Resource)

  10. ES6知识整理(5)--对象的扩展

    个人开这个公众号的初心是为了积累知识,因此并没有做什么推广,再说自己也不知道怎么推广,推广之后又能干些什么.已经将近10天没发文章了,虽然每天都加班,但也不会一点时间都没有,有时还是会懒癌发作不想学习 ...