博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SDOI2017 新生舞会
阅读量:5855 次
发布时间:2019-06-19

本文共 2836 字,大约阅读时间需要 9 分钟。

01规划

 

a1+a2+a3+...+ai/b1+b2+b2+..bi最大

 

设一个k

使得

  a1+a2+a3+...+ai/b1+b2+b3+...bi>=k

 

变换式子得到

  a1+a2+a3+...ai>=(b1+b2+b3+..+bi)*k

  a1-b1*k+a2-b2*k+a3-b3*k+...+ai-bi*k>=0

 

  ai-bi*k即流量

  最大费用流+二分答案

 

来,上代码:

#include 
#include
#include
using namespace std;#define eps 1e-8#define maxn 205int ai[maxn][maxn],bi[maxn][maxn],ma,mi,pre[maxn],s,t,h,tail,cnt;int n,head[maxn],E[maxn*maxn],V[maxn*maxn],F[maxn*maxn],que[maxn<<8];double W[maxn*maxn],suma,sumb,dis[maxn];bool if_[maxn];inline void in(int &now_){ register int now=0; register char Cget=getchar(); while(Cget>'9'||Cget<'0') Cget=getchar(); while(Cget>='0'&&Cget<='9') { now=now*10+Cget-'0'; Cget=getchar(); } now_=now;}inline bool spfa(){ for(int i=s;i<=t;i++) dis[i]=-1e6,pre[i]=-1,if_[i]=false; h=maxn<<4,tail=h+1,que[h]=s,dis[s]=0,if_[s]=true; while(h
0) { pre[V[i]]=i; dis[V[i]]=dis[now]+W[i]; if(!if_[V[i]]) { if_[V[i]]=true; if(dis[V[i]]>dis[que[h]]) que[--h]=V[i]; else que[tail++]=V[i]; } } } } return dis[t]!=-1e6;}int main(){ freopen("ball.in","r",stdin); freopen("ball.out","w",stdout); in(n);t=n<<1|1; for(register int i=1;i<=n;i++) { ma=0; for(register int j=1;j<=n;j++) in(ai[i][j]),ma=max(ma,ai[i][j]); suma+=ma; } for(register int i=1;i<=n;i++) { mi=0x7fffffff; for(register int j=1;j<=n;j++) in(bi[i][j]),mi=min(mi,bi[i][j]); sumb+=mi; } double l=0,r=suma/sumb,mid,ans; while(r-l>eps) { mid=(l+r)/2.0,cnt=1; for(register int i=s;i<=t;i++) head[i]=0; for(register int i=1;i<=n;i++) { E[++cnt]=head[s],V[cnt]=i,F[cnt]=1,W[cnt]=0,head[s]=cnt; E[++cnt]=head[i],V[cnt]=s,F[cnt]=0,W[cnt]=0,head[i]=cnt; E[++cnt]=head[t],V[cnt]=i+n,F[cnt]=0,W[cnt]=0,head[t]=cnt; E[++cnt]=head[i+n],V[cnt]=t,F[cnt]=1,W[cnt]=0,head[i+n]=cnt; for(register int j=1;j<=n;j++) { register int o=j+n; register double pos=(double)ai[i][j]-mid*bi[i][j]; E[++cnt]=head[i],V[cnt]=o,F[cnt]=1,W[cnt]=pos,head[i]=cnt; E[++cnt]=head[o],V[cnt]=i,F[cnt]=0,W[cnt]=-pos,head[o]=cnt; } } double sum=0; while(spfa()) { sum+=dis[t]; register int now=t; while(pre[now]!=-1) F[pre[now]]--,F[pre[now]^1]++,now=V[pre[now]^1]; } if(sum>0) ans=mid,l=mid+eps; else r=mid-eps; } printf("%.6lf",ans); fclose(stdin),fclose(stdout); return 0;}

 

转载于:https://www.cnblogs.com/IUUUUUUUskyyy/p/6691178.html

你可能感兴趣的文章
Windows服务器重启导致filebeat无法启动
查看>>
5个常见的展示不同类型数据的错误形式以及如何避免
查看>>
CVE-2017-9805:Struts2 REST插件远程执行命令漏洞(S2-052) 分析报告
查看>>
助人就是助己:IBM宣布大规模资助开源大数据项目Spark
查看>>
Faraday:协同渗透测试与安全漏洞管理平台
查看>>
Apache Beam: 下一代的大数据处理标准
查看>>
数据中心设计最佳方案:超越功率和冷却措施的效率提升
查看>>
AirBulb:会唱歌的灯泡
查看>>
信息泄露事件大盘点!!
查看>>
微软:吸引云技术面临哪些困难?
查看>>
来自斯坦福的声音:可穿戴设备能预测疾病发生
查看>>
CRM逐渐在被淘汰,但这是件好事!
查看>>
新型智慧城市如何建?
查看>>
WCF的追踪分析工具——SvcPerf
查看>>
中国酒业大数据中心成立
查看>>
为了上网更安全 不要再用密码是一个方法
查看>>
福特狂挖黑莓员工,只为车联网
查看>>
深度:自动驾驶特斯拉背后核心技术解析
查看>>
74个顶级的物联网设备一览
查看>>
智能化需求促进安防行业进一步升级
查看>>