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

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

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

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

/**************************************************************
    Problem: 3232
    User: BLADEVIL
    Language: Pascal
    Result: Time_Limit_Exceed
****************************************************************/
 
//By BLADEVIL
const
    lim                         =1e-5;
     
var
    n, m                        :longint;
    pre, other                  :array[0..100010] of longint;
    len                         :array[0..100010] of extended;
    last                        :array[0..3010] of longint;
    tot                         :longint;
    num                         :array[0..60,0..60] of longint;
    key, heng, shu              :array[0..60,0..60] of longint;
    sum                         :longint;
    print                       :extended;
    que, d                      :array[0..3010] of longint;
    source, sink                :longint;
     
function min(a,b:extended):extended;
begin
    if a>b then min:=b else min:=a;
end;
 
function judge(x:extended):extended;
begin
    if abs(x)<lim then exit(0);
    if x<0 then exit(-1) else exit(1);
end;
     
procedure connect(x,y:longint;z:extended);
begin
    inc(tot);
    pre[tot]:=last[x];
    last[x]:=tot;
    other[tot]:=y;
    len[tot]:=z;
end;
     
procedure init;
var
    i, j                        :longint;
     
begin
    read(n,m);
    for i:=1 to n do
        for j:=1 to m do num[i,j]:=(i-1)*m+j;
    for i:=1 to n do
        for j:=1 to m do
        begin
            read(key[i,j]);
            sum:=sum+key[i,j];
        end;
    for i:=1 to n+1 do
        for j:=1 to m do read(heng[i,j]);
    for i:=1 to n do
        for j:=1 to m+1 do read(shu[i,j]);
    source:=num[n,m]+2;
    sink:=source+1;
end;
 
function bfs:boolean;
var
    q, p                        :longint;
    h, t, cur                   :longint;
begin
    fillchar(d,sizeof(d),0);
    d[source]:=1;
    h:=0; t:=1; que[1]:=source;
    while h<t do
    begin
        inc(h);
        cur:=que[h];
        q:=last[cur];
        while q<>0 do
        begin
            p:=other[q];
            if (judge(len[q])>0) and (d[p]=0) then
            begin
                inc(t);
                que[t]:=p;
                d[p]:=d[cur]+1;
                if p=sink then exit(true);
            end;
            q:=pre[q];
        end;
    end;
    exit(false);
end;
 
function dinic(x:longint;flow:extended):extended;
var
    rest, tmp                   :extended;
    q, p                        :longint;
     
begin
    if x=sink then exit(flow);
    rest:=flow;
    q:=last[x];
    while q<>0 do
    begin
        p:=other[q];
        if (judge(len[q])>0) and (d[p]=d[x]+1) and (rest>0) then
        begin
            tmp:=dinic(p,min(rest,len[q]));
            rest:=rest-tmp;
            len[q]:=len[q]-tmp;
            len[q xor 1]:=len[q xor 1]+tmp;
        end;
        q:=pre[q];
    end;
    exit(flow-rest);
end;
 
procedure main;
var
    l, r, mid                   :extended;
    cur                         :longint;
    ans                         :extended;
    i, j                        :longint;
     
begin
    l:=0; r:=90;
    while r-l>lim do
    begin
        mid:=(l+r)/2;
        fillchar(last,sizeof(last),0);
        tot:=1;
        for i:=1 to n do
            for j:=1 to m do
            begin
                connect(source,num[i,j],key[i,j]);
                connect(num[i,j],source,0);
            end;
         
        for i:=1 to n do
            for j:=1 to m do
            begin
                cur:=0;
                if i=1 then inc(cur,heng[i,j]);
                if i=n then inc(cur,heng[i+1,j]);
                if j=1 then inc(cur,shu[i,j]);
                if j=m then inc(cur,shu[i,j+1]);
                if cur>0 then
                begin
                    connect(num[i,j],sink,cur*mid);
                    connect(sink,num[i,j],0);
                end;
            end;
        for i:=1 to n-1 do
            for j:=1 to m do
            begin
                connect(num[i,j],num[i+1,j],heng[i+1,j]*mid);
                connect(num[i+1,j],num[i,j],heng[i+1,j]*mid);
            end;
        for i:=1 to n do
            for j:=1 to m-1 do
            begin
                connect(num[i,j],num[i,j+1],shu[i,j+1]*mid);
                connect(num[i,j+1],num[i,j],shu[i,j+1]*mid);
            end;
        ans:=0;
        while bfs do
            ans:=ans+dinic(source,maxlongint);
        if judge(sum-ans)>0 then l:=mid else r:=mid;
    end;
    writeln(l:0:3);
end;
 
begin
    init;
    main;
end.

转载于:https://www.cnblogs.com/BLADEVIL/p/3500432.html

bzoj 3232 01分数规划+最大权封闭子图判定相关推荐

  1. bzoj 1690: [Usaco2007 Dec]奶牛的旅行(01分数规划--最优比率环)

    01分数规划问题: 给你n个物品,a[i]表示第i个物品的收益,b[i]表示代价,x[i]表示选或不选,求一个最佳方案使得下式取值最大 通用解: 当然是从式子上考虑,定义函数F[cnt]如下: 其中c ...

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

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

  3. [01分数规划]【学习笔记】

    01分数规划 $N$个物品选$k$个,最大化: $\frac{\sum\limits_{i=1}^{k}A_i}{\sum\limits_{i=1}^{k}B_i}$ 二分答案$mid$ 如果 $\s ...

  4. 分治 —— 01 分数规划

    [概述] 分数规划的一般形式为: 特别的,当  时,称为 01 分数规划 简单来说,就是有一些二元组 (a[i],b[i]),现在从中选择某些二元组,使得  最大或最小 这一类题通用的解法是利用二分法 ...

  5. bzoj3232: 圈地游戏 0-1分数规划

    第一次接触到分数规划,没想到做题的时候难点不在这上头,反而在如何分数规划后,怎么用建立网络,我承认,做不来,建图是在网上剽窃的. 建图具体做法如下: 首先在原矩阵周围再加上一圈,将原矩阵包围起来,对于 ...

  6. poj2976(0-1分数规划)

    0-1分数规划 设x[i]等于1或0. 则我们所求的比率 rate = ∑(cost[i] * x[i]) / ∑(cost[i] * x[i]), 0≤i<m . z( rate ) = ∑( ...

  7. 点分治问题 ----------- luoguP2942 [WC2010]重建计划 [点分治 + bfs + 单调队列 + 预处理建树 + 二分 + 01分数规划]

    题目链接 解题思路: 1.对于这个Avgvalue=∑e∈sv(e)∣s∣Avgvalue = \frac{\sum_{e\in s}v(e)}{|s|}Avgvalue=∣s∣∑e∈s​v(e)​ ...

  8. 解题报告:AcWing 1165. 单词环(01分数规划、hash、经验优化)

    本题的关键在于: 建图 01分数规划 本题的数据过大,如果直接spfa判断会TLE,因此我们使用经验优化,就是如果所有的点入队的次数过多,比如大于100000,那么我们直接认为它是存在正环的.(免去T ...

  9. 模板 - 判断负环(超时高效优化技巧)、01分数规划

    整理的算法模板合集: ACM模板 判断负环 判正环求最长路,判负环求最短路 int n; // 总点数 int h[N], w[N], e[N], ne[N], idx; // 邻接表存储所有边 in ...

最新文章

  1. 人人都会Vue,你的优势在哪里?
  2. 清华Thinker团队提出AI计算芯片存储优化新方法 | ISCA 2018中国唯一一作论文
  3. android adb apk包名,ADB命令简单使用--查看包名、activity等
  4. SpringBoot 如何生成接口文档,老鸟们都这么玩的!
  5. 姚安娜首个代言摩卡汽车人舞蹈短片出炉
  6. 视觉平台搭建——光源选择
  7. 用Portainer或UI for Docker可视化管理树莓派容器
  8. HTML关联两个标签事件,javascript – 交换2个html元素并保留事件侦听器
  9. windows10 显示实时网速
  10. 使用onvif协议操作设备
  11. 妈耶,摆脱机器音,二次宅的歌姬女友彻底活了
  12. 【吹爆】2022金三银四高频面试题最强合集
  13. RD Client远程控制PC
  14. 在html中对页面大小的设置吗,网页设计一般页面尺寸怎么设置呢?
  15. ug中许可证服务器,ug教程:ug服务器许可证(LMTOOLS)设置教程
  16. 机器人主要有哪几部分组成?
  17. Nodejs+Express项目使用JWT
  18. 【2019.07.10】python + OpenCV + adb 实现 自动 微信跳一跳
  19. html5 制作 蓝色按钮,一组黑色质感的蓝色荧光3D按钮和单选按钮
  20. linux中标麒麟u盘制作,中标麒麟桌面操作系统龙芯版系统安装盘(U盘)制作方法

热门文章

  1. BZOJ3144: [Hnoi2013]切糕
  2. C算法编程题(二)正螺旋
  3. java笔记之连接数据库
  4. 微软开始提供公共预览版Windows 8.1下载
  5. TP-Link路由器下的多种接入模式
  6. 《认清C++语言》のrandom_shuffle()和transform()算法
  7. 使用C语言进行面向对象的开发--GObject入门[5]
  8. movielens推荐系统_基于内容推荐(二)
  9. sklearn 安装_初识sklearn
  10. python is beautiful_Python list 和 str 互转