原题传送门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的更多相关文章

  1. [BZOJ 1044] [HAOI2008] 木棍分割 【二分 + DP】

    题目链接:BZOJ 1044 第一问是一个十分显然的二分,贪心Check(),很容易就能求出最小的最大长度 Len . 第二问求方案总数,使用 DP 求解. 使用前缀和,令 Sum[i] 为前 i 根 ...

  2. bzoj 1907: 树的路径覆盖【贪心+树形dp】

    我是在在做网络流最小路径覆盖的时候找到这道题的 然后发现是个贪心+树形dp \( f[i] \)表示在\( i \)为根的子树中最少有几条链,\( v[i] \) 表示在\( i \)为根的子树中\( ...

  3. 贪心/构造/DP 杂题选做Ⅱ

    由于换了台电脑,而我的贪心 & 构造能力依然很拉跨,所以决定再开一个坑( 前传: 贪心/构造/DP 杂题选做 u1s1 我预感还有Ⅲ(欸,这不是我在多项式Ⅱ中说过的原话吗) 24. P5912 ...

  4. BZOJ 1044: [HAOI2008]木棍分割

    Description 求 \(n\) 根木棍长度为 \(L\) ,分成 \(m\) 份,使最长长度最短,并求出方案数. Sol 二分+DP. 二分很简单啊,然后就是方案数的求法. 状态就是 \(f[ ...

  5. 贪心/构造/DP 杂题选做Ⅲ

    颓!颓!颓!(bushi 前传: 贪心/构造/DP 杂题选做 贪心/构造/DP 杂题选做Ⅱ 51. CF758E Broken Tree 讲个笑话,这道题是 11.3 模拟赛的 T2,模拟赛里那道题的 ...

  6. 二分+DP HDU 3433 A Task Process

    HDU 3433 A Task Process Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  7. BZOJ 1044 木棍分割

    二分+dp. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm ...

  8. poj 2782 Bin Packing (贪心+二分)

    F - 贪心+ 二分 Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu   Description ...

  9. Card Game Cheater(贪心+二分匹配)

    Card Game Cheater Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

随机推荐

  1. 【个人训练】(ZOJ3983)Crusaders Quest

    题意分析 和祖玛类似的那种玩法.不过是限定了九个字符,问最好情况下有几次三连碰. 暴力穷举即可.具体的做法是,先把所有"成块"的字符记录下来,然后一个一个删,再继续这样子递归做下去 ...

  2. 自动化测试--封装JDBCUnit

    在进行测试的时候,经常需要对数据库进行操作.我们知道,通过代码与数据库交互,需要以下几步: 1.加载驱动 之前有盆友问我,为什么Selenium操作浏览器的时候,非要下载浏览器驱动?为啥对数据库进行操 ...

  3. 孤荷凌寒自学python第六十八天学习并实践beautifulsoup模块1

    孤荷凌寒自学python第六十八天学习并实践beautifulsoup模块1 (完整学习过程屏幕记录视频地址在文末) 感觉用requests获取到网页的html源代码后,更重要的工作其实是分析得到的内 ...

  4. Python 3 学习笔记之——键盘输入和读写文件

    1. 键盘输入 Python提供了 input() 内置函数从标准输入读入一行文本,默认的标准输入是键盘.input 可以接收一个 Python 表达式作为输入,并将运算结果返回. str = inp ...

  5. mysql语法总结

    增: 删: 改: 查: 索引: 建: alter table: sql一些常用的经典语句,最后是select as的用法

  6. BZOJ 3670 NOI2014 动物园 KMP+dp

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3670 题意概述:令num[i]表示字符串由1~i的字符形成的前缀中不相重叠的相同前后缀的数 ...

  7. DFS(7)——poj1011Sticks

    一.题目回顾 题目链接:Sticks 题意:给出一定数量的小木棒的长度,它是由等长的若干木棒随意砍断所得到的.对于给定的一组小木棒,请求出原始木棒的最小长度. 二.解题思路 DFS+剪枝 本题剪枝不到 ...

  8. JavaWeb笔记(十二)日志

    日志 日志信息根据用途与记录内容的不同,分为调试日志.运行日志.异常日志等. Java常用记录日志 logger log4j log4j2 logback 其中除了logger使用的概率较小,因此主要 ...

  9. C#编译和运行原理

    关于编译与内存的关系,以及执行时内存的划分 1.所谓在编译期间分配空间指的是静态分配空间(相对于用new动态申请空间),如全局变量或静态变量(包括一些复杂类型的 常量),它们所需要的空间大小可以明确计 ...

  10. Mybatis学习系列(二)Mapper映射文件

    Mapper映射文件,作用是用来配置SQL映射语句,根据不同的SQL语句性质,使用不同的标签,mapper文件中常用的标签有<iselect>.<insert>.<upd ...