bzoj 1044 贪心二分+DP
原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1044
首先对于第一问,我们可以轻易的用二分答案来搞定,对于每一个二分到的mid值
我们从len[i]开始累加,每到累加值>mid的时候,就累加一个需要砍的次数,然后
比较次数和m的大小关系,然后二分就行了,这里有个小贪心,对于一个len[i],我们
尽量的不让他消耗一次砍得次数,直到非砍不可了才砍。
那么问题就转化成了我们有N个木条的长度,用最多M刀将他们分为不超过ans长度的方案数
我们用w[j,i]代表砍j刀,前i个木条的方案数,那么可以轻易的得到转移方程
w[j,i]:=sigma(w[j-1,k]) sum[i]-sum[k-1]<=ans
其中sum是长度的前缀和
分析下,这个时间复杂度是n*n*m的,明显过不去,那么想下优化
我们可以知道,sum是不变的,换句话说,就是每个转移到I的k是不变的,且是连续区间
那么我们对于每个i,存下pre[i],代表最早pre[i]能更新I,那么我们w[j,i]也存成前缀和,
对于每个w[j,i]就可以o(1)的转移了
而且这道题会卡空间,需要用滚动数组
自己的超时了,照着大神的改了改。。。
- /**************************************************************
- Problem:
- User: BLADEVIL
- Language: Pascal
- Result: Accepted
- Time: ms
- Memory: kb
- ****************************************************************/
- var
- w :array[..,-..] of longint;
- pre, a, s :array[-..] of longint;
- last :array[-..] of longint;
- p, ans2, tot :longint;
- max, tmp :longint;
- i, j, h, k :longint;
- l, r, mid, ans :longint;
- n, m :longint;
- function check(x:longint):boolean;
- var i :longint;
- begin
- if max>x then exit(false);
- tmp:=;
- tot:=;
- for i:= to n do
- begin
- if tmp+a[i]<=x then tmp:=tmp+a[i]
- else begin
- tmp:=a[i];
- inc(tot);
- if tot>m then exit(false);
- end;
- end;
- exit(true);
- end;
- begin
- readln(n,m);
- if n= then
- begin
- writeln(,' ',);
- exit;
- end;
- for i:= to n do
- begin
- readln(a[i]);
- s[i]:=s[i-]+a[i];
- if max<a[i] then max:=a[i];
- end;
- l:=;
- r:=s[n];
- while l<r do
- begin
- if l=r- then
- begin
- if check(l) then ans:=l
- else ans:=r;
- break;
- end;
- mid:=(l+r) shr ;
- if check(mid) then r:=mid else l:=mid;
- end;
- tmp:=;
- tot:=;
- for i:= to n do
- begin
- if tmp+a[i]>ans then
- begin
- tmp:=a[i];
- inc(tot);
- last[tot]:=i-;
- end else tmp:=tmp+a[i];
- end;
- for i:=tot+ to m+ do last[i]:=n;
- h:=;
- for i:= to n do
- begin
- while s[i]-s[h]>ans do inc(h);
- pre[i]:=h;
- end;
- for i:= to last[] do w[,i]:=w[,i-]+;
- for i:=last[]+ to last[] do w[,i]:=w[,i-];
- l:=;
- for i:= to m+ do
- begin
- k:=l;
- l:=k xor ;
- w[l,i]:=;
- p:=;
- for j:=i+ to last[i] do
- begin
- p:=w[k,j-]-w[k,pre[j]-];
- w[l,j]:=(w[l,j-]+p) mod ;
- end;
- if last[i]=n then ans2:=(ans2+p) mod
- else begin
- for j:=last[i]+ to last[i+] do w[l,j]:=w[l,j-];
- end;
- end;
- writeln(ans,' ',(ans2 mod +) mod );
- end.
bzoj 1044 贪心二分+DP的更多相关文章
- [BZOJ 1044] [HAOI2008] 木棍分割 【二分 + DP】
题目链接:BZOJ 1044 第一问是一个十分显然的二分,贪心Check(),很容易就能求出最小的最大长度 Len . 第二问求方案总数,使用 DP 求解. 使用前缀和,令 Sum[i] 为前 i 根 ...
- bzoj 1907: 树的路径覆盖【贪心+树形dp】
我是在在做网络流最小路径覆盖的时候找到这道题的 然后发现是个贪心+树形dp \( f[i] \)表示在\( i \)为根的子树中最少有几条链,\( v[i] \) 表示在\( i \)为根的子树中\( ...
- 贪心/构造/DP 杂题选做Ⅱ
由于换了台电脑,而我的贪心 & 构造能力依然很拉跨,所以决定再开一个坑( 前传: 贪心/构造/DP 杂题选做 u1s1 我预感还有Ⅲ(欸,这不是我在多项式Ⅱ中说过的原话吗) 24. P5912 ...
- BZOJ 1044: [HAOI2008]木棍分割
Description 求 \(n\) 根木棍长度为 \(L\) ,分成 \(m\) 份,使最长长度最短,并求出方案数. Sol 二分+DP. 二分很简单啊,然后就是方案数的求法. 状态就是 \(f[ ...
- 贪心/构造/DP 杂题选做Ⅲ
颓!颓!颓!(bushi 前传: 贪心/构造/DP 杂题选做 贪心/构造/DP 杂题选做Ⅱ 51. CF758E Broken Tree 讲个笑话,这道题是 11.3 模拟赛的 T2,模拟赛里那道题的 ...
- 二分+DP HDU 3433 A Task Process
HDU 3433 A Task Process Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- BZOJ 1044 木棍分割
二分+dp. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm ...
- poj 2782 Bin Packing (贪心+二分)
F - 贪心+ 二分 Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Description ...
- Card Game Cheater(贪心+二分匹配)
Card Game Cheater Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
随机推荐
- 《剑指offer》题解
有段时间准备找工作,囫囵吞枣地做了<剑指offer>提供的编程习题,下面是题解收集. 当初没写目录真是个坏习惯(-_-)||,自己写的东西都要到处找. 提交的源码可以在此repo中找到:h ...
- iOS-合成图片(长图)
合成图片 直接合成图片还是比较简单的,现在的难点是要把,通过文本输入的一些基本数据也合成到一张图片中,如果有多长图片就合成长图. 现在的实现方法是,把所有的文本消息格式化,然后绘制到一个UILable ...
- 30分钟快速搭建Web CRUD的管理平台--django神奇魔法
加上你的准备的时间,估计30分钟完全够用了,因为最近在做爬虫管理平台,想着快速开发,没想到python web平台下有这么非常方便的框架,简洁而优雅.将自己的一些坑总结出来,方便给大家的使用. 准备环 ...
- 用Fluent实现MySQL到ODPS数据集成
安装ruby 首先通过 /etc/issue 命令查看当前使用centos是哪个版本: [hadoop@hadoop03 ~]$ cat /etc/issue 由于centos版本是6.6,安装ru ...
- 机器学习/逻辑回归(logistic regression)/--附python代码
个人分类: 机器学习 本文为吴恩达<机器学习>课程的读书笔记,并用python实现. 前一篇讲了线性回归,这一篇讲逻辑回归,有了上一篇的基础,这一篇的内容会显得比较简单. 逻辑回归(log ...
- LeetCode - 67. Add Binary(4ms)
Given two binary strings, return their sum (also a binary string). The input strings are both non-em ...
- git instaweb 500 error
在arch 系统中安装perl-cgi包. 在deiban中参考:https://git-scm.com/book/zh/v2/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A ...
- HDU 4747 Mex(线段树)(2013 ACM/ICPC Asia Regional Hangzhou Online)
Problem Description Mex is a function on a set of integers, which is universally used for impartial ...
- URAL 1936 Roshambo(求期望)
Description Bootstrap: Wondering how it's played? Will: It's a game of deception. But your bet inclu ...
- android仿QQ的SlideMenu
这其实很简单就可以实现,只需要自定义一个View继承自HorizontalScrollView 1,新建一个项目,再新建一个MySlideMenu继承HorizontalScrollView publ ...