我们的目标是使v/c最小化,所以构造函数g(x)=v-x*c,那么

二分一个X,判断当时的v-x*c的值是多少,然后根据g(x)函数的

单调递减性来二分,判断,直到g(x)=0的时候当前的X就是答案。

然后我直接写的tle了,这是这两天tle的第3道题了。。。再改改。。。

  1. /**************************************************************
  2.     Problem: 3232
  3.     User: BLADEVIL
  4.     Language: Pascal
  5.     Result: Time_Limit_Exceed
  6. ****************************************************************/
  7.  
  8. //By BLADEVIL
  9. const
  10.     lim                         =1e-5;
  11.      
  12. var
  13.     n, m                        :longint;
  14.     pre, other                  :array[0..100010] of longint;
  15.     len                         :array[0..100010] of extended;
  16.     last                        :array[0..3010] of longint;
  17.     tot                         :longint;
  18.     num                         :array[0..60,0..60] of longint;
  19.     key, heng, shu              :array[0..60,0..60] of longint;
  20.     sum                         :longint;
  21.     print                       :extended;
  22.     que, d                      :array[0..3010] of longint;
  23.     source, sink                :longint;
  24.      
  25. function min(a,b:extended):extended;
  26. begin
  27.     if a>b then min:=b else min:=a;
  28. end;
  29.  
  30. function judge(x:extended):extended;
  31. begin
  32.     if abs(x)<lim then exit(0);
  33.     if x<0 then exit(-1) else exit(1);
  34. end;
  35.      
  36. procedure connect(x,y:longint;z:extended);
  37. begin
  38.     inc(tot);
  39.     pre[tot]:=last[x];
  40.     last[x]:=tot;
  41.     other[tot]:=y;
  42.     len[tot]:=z;
  43. end;
  44.      
  45. procedure init;
  46. var
  47.     i, j                        :longint;
  48.      
  49. begin
  50.     read(n,m);
  51.     for i:=1 to n do
  52.         for j:=1 to m do num[i,j]:=(i-1)*m+j;
  53.     for i:=1 to n do
  54.         for j:=1 to m do
  55.         begin
  56.             read(key[i,j]);
  57.             sum:=sum+key[i,j];
  58.         end;
  59.     for i:=1 to n+1 do
  60.         for j:=1 to m do read(heng[i,j]);
  61.     for i:=1 to n do
  62.         for j:=1 to m+1 do read(shu[i,j]);
  63.     source:=num[n,m]+2;
  64.     sink:=source+1;
  65. end;
  66.  
  67. function bfs:boolean;
  68. var
  69.     q, p                        :longint;
  70.     h, t, cur                   :longint;
  71. begin
  72.     fillchar(d,sizeof(d),0);
  73.     d[source]:=1;
  74.     h:=0; t:=1; que[1]:=source;
  75.     while h<t do
  76.     begin
  77.         inc(h);
  78.         cur:=que[h];
  79.         q:=last[cur];
  80.         while q<>0 do
  81.         begin
  82.             p:=other[q];
  83.             if (judge(len[q])>0) and (d[p]=0) then
  84.             begin
  85.                 inc(t);
  86.                 que[t]:=p;
  87.                 d[p]:=d[cur]+1;
  88.                 if p=sink then exit(true);
  89.             end;
  90.             q:=pre[q];
  91.         end;
  92.     end;
  93.     exit(false);
  94. end;
  95.  
  96. function dinic(x:longint;flow:extended):extended;
  97. var
  98.     rest, tmp                   :extended;
  99.     q, p                        :longint;
  100.      
  101. begin
  102.     if x=sink then exit(flow);
  103.     rest:=flow;
  104.     q:=last[x];
  105.     while q<>0 do
  106.     begin
  107.         p:=other[q];
  108.         if (judge(len[q])>0) and (d[p]=d[x]+1) and (rest>0) then
  109.         begin
  110.             tmp:=dinic(p,min(rest,len[q]));
  111.             rest:=rest-tmp;
  112.             len[q]:=len[q]-tmp;
  113.             len[q xor 1]:=len[q xor 1]+tmp;
  114.         end;
  115.         q:=pre[q];
  116.     end;
  117.     exit(flow-rest);
  118. end;
  119.  
  120. procedure main;
  121. var
  122.     l, r, mid                   :extended;
  123.     cur                         :longint;
  124.     ans                         :extended;
  125.     i, j                        :longint;
  126.      
  127. begin
  128.     l:=0; r:=90;
  129.     while r-l>lim do
  130.     begin
  131.         mid:=(l+r)/2;
  132.         fillchar(last,sizeof(last),0);
  133.         tot:=1;
  134.         for i:=1 to n do
  135.             for j:=1 to m do
  136.             begin
  137.                 connect(source,num[i,j],key[i,j]);
  138.                 connect(num[i,j],source,0);
  139.             end;
  140.          
  141.         for i:=1 to n do
  142.             for j:=1 to m do
  143.             begin
  144.                 cur:=0;
  145.                 if i=1 then inc(cur,heng[i,j]);
  146.                 if i=n then inc(cur,heng[i+1,j]);
  147.                 if j=1 then inc(cur,shu[i,j]);
  148.                 if j=m then inc(cur,shu[i,j+1]);
  149.                 if cur>0 then
  150.                 begin
  151.                     connect(num[i,j],sink,cur*mid);
  152.                     connect(sink,num[i,j],0);
  153.                 end;
  154.             end;
  155.         for i:=1 to n-1 do
  156.             for j:=1 to m do
  157.             begin
  158.                 connect(num[i,j],num[i+1,j],heng[i+1,j]*mid);
  159.                 connect(num[i+1,j],num[i,j],heng[i+1,j]*mid);
  160.             end;
  161.         for i:=1 to n do
  162.             for j:=1 to m-1 do
  163.             begin
  164.                 connect(num[i,j],num[i,j+1],shu[i,j+1]*mid);
  165.                 connect(num[i,j+1],num[i,j],shu[i,j+1]*mid);
  166.             end;
  167.         ans:=0;
  168.         while bfs do
  169.             ans:=ans+dinic(source,maxlongint);
  170.         if judge(sum-ans)>0 then l:=mid else r:=mid;
  171.     end;
  172.     writeln(l:0:3);
  173. end;
  174.  
  175. begin
  176.     init;
  177.     main;
  178. end.

bzoj 3232 01分数规划+最大权封闭子图判定的更多相关文章

  1. 2018.11.06 NOIP训练 最大获利(profit)(01分数规划+最大权闭合子图)

    传送门 好题啊. ∑i<jpi,jK∗(200−K)>X\frac{\sum_{i<j}p_{i,j}}{K*(200-K)}>XK∗(200−K)∑i<j​pi,j​​ ...

  2. LibreOJ 2003. 「SDOI2017」新生舞会 基础01分数规划 最大权匹配

    #2003. 「SDOI2017」新生舞会 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  3. BZOJ.1312.[Neerc2006]Hard Life(分数规划 最大权闭合子图)

    BZOJ 最大密度子图. 二分答案\(x\),转为求是否存在方案满足:\(边数-x*点数\geq 0\). 选一条边就必须选两个点,所以可以转成最大权闭合子图.边有\(1\)的正权,点有\(x\)的负 ...

  4. bzoj 3232 圈地游戏 —— 01分数规划+最小割建图(最大权闭合子图)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 心烦意乱的时候调这道题真是...越调越气,就这样过了一晚上... 今天再认真看看,找出 ...

  5. bzoj 3232: 圈地游戏 01分数规划

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3232 题解: 首先我们看到这道题让我们最优化一个分式. 所以我们应该自然而然地想到01分 ...

  6. 【bzoj 3232】圈地游戏(算法效率--01分数规划+图论--最小割)

    题目:DZY家的后院有一块地,由N行M列的方格组成,格子内种的菜有一定的价值,并且每一条单位长度的格线有一定的费用.DZY喜欢在地里散步.他总是从任意一个格点出发,沿着格线行走直到回到出发点,且在行走 ...

  7. BZOJ.4753.[JSOI2016]最佳团体(01分数规划 树形背包DP)

    题目链接 \(Description\) 每个点有费用si与价值pi,要求选一些带根的连通块,总大小为k,使得 \(\frac{∑pi}{∑si}\) 最大 \(Solution\) 01分数规划,然 ...

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

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

  9. 【BZOJ】4753: [Jsoi2016]最佳团体 01分数规划+树上背包

    [题意]n个人,每个人有价值ai和代价bi和一个依赖对象ri<i,选择 i 时 ri 也必须选择(ri=0时不依赖),求选择k个人使得Σai/Σbi最大.n<=2500,ai,bi< ...

随机推荐

  1. DevExpress 14.2 批量汉化 以及客户端的汉化

    DXperience汉化方法介绍 运用慧都提供的DXperience汉化包,能将最新版本的DXperience WinForm和ASP.NET控件界面.弹出框.右键菜单等汉化成中文,且能根据自己的需求 ...

  2. scan的filter使用

    本次操作的hbase的t1表的数据是: hbase(main)::> scan 't1' ROW COLUMN+CELL column=f1:age, timestamp=, value= co ...

  3. Bitmap.Config 详解

    前言 Android是一个内存相当吃紧的系统,那么在做程序的过程中使用内存就需要相当谨慎,而我们接触最大的大对象估计就是Bitmap了,那么下面就根据Bitmap.Config值的介绍来看下Bitma ...

  4. keytool 获取证书信息

    keytool -list -v -keystore E:\androidkestore 红色部分为证书地址 输入密码后得到md5及sha1 google地图和百度地图申请key可能用到

  5. Hive启动时的棘手问题的处理

    Hive是存在于Hadoop集群之上的数据仓库,作为大数据处理时的主要工具,对于大数据开发人员的重要性不言而喻.当然要使用Hive仓库的前提就是对于hive的安装,hive的安装是很简单的过程,主要关 ...

  6. jquery异步上传文件,支持IE8

    http://code.taobao.org/p/upload2/src/ 已经托管至淘宝code 源码:http://code.taobao.org/p/upload2/src/jquery.upl ...

  7. c语言结构体保存并输出学生信息

    最近在学习数据结构,巩固下c语言. #include<stdio.h> /*定义结构体student并设置别名stud*/ /*typedef struct student{ int nu ...

  8. 小米miui5系统的webview在处理动画事件transitionEnd事件时,竟然要用transitionend才行

    一般的安卓系统用的是webkitTransitionEnd, 而小米的系统我用了webkitTransitionEnd事件无法执行,只能用transitionend才会被执行,怪

  9. Outlook打不开? 进程一大堆!

    问题描述: ====== 关闭Outlook应用程序后,Outlook.exe进程仍在任务管理器里继续运行,不能关闭. 原因: ====== Outlook的插件或者扩展程序阻止Outlook关闭 解 ...

  10. Ubuntu下sqlite3的安装及使用

    Sqlite是一款轻型的数据库,实现了多数SQL-92标准,包括事务(原子性,一致性,隔离性和持久性 ACID),触发器与多数复杂查询.对于一个移动手持设备的应用开发者,Sqlite是居家旅行必备数据 ...