原题传送门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)的转移了

而且这道题会卡空间,需要用滚动数组

自己的超时了,照着大神的改了改。。。

  1. /**************************************************************
  2. Problem:
  3. User: BLADEVIL
  4. Language: Pascal
  5. Result: Accepted
  6. Time: ms
  7. Memory: kb
  8. ****************************************************************/
  9.  
  10. var
  11. w :array[..,-..] of longint;
  12. pre, a, s :array[-..] of longint;
  13. last :array[-..] of longint;
  14. p, ans2, tot :longint;
  15. max, tmp :longint;
  16. i, j, h, k :longint;
  17. l, r, mid, ans :longint;
  18. n, m :longint;
  19.  
  20. function check(x:longint):boolean;
  21. var i :longint;
  22. begin
  23. if max>x then exit(false);
  24. tmp:=;
  25. tot:=;
  26. for i:= to n do
  27. begin
  28. if tmp+a[i]<=x then tmp:=tmp+a[i]
  29. else begin
  30. tmp:=a[i];
  31. inc(tot);
  32. if tot>m then exit(false);
  33. end;
  34. end;
  35. exit(true);
  36. end;
  37.  
  38. begin
  39. readln(n,m);
  40. if n= then
  41. begin
  42. writeln(,' ',);
  43. exit;
  44. end;
  45. for i:= to n do
  46. begin
  47. readln(a[i]);
  48. s[i]:=s[i-]+a[i];
  49. if max<a[i] then max:=a[i];
  50. end;
  51. l:=;
  52. r:=s[n];
  53. while l<r do
  54. begin
  55. if l=r- then
  56. begin
  57. if check(l) then ans:=l
  58. else ans:=r;
  59. break;
  60. end;
  61. mid:=(l+r) shr ;
  62. if check(mid) then r:=mid else l:=mid;
  63. end;
  64.  
  65. tmp:=;
  66. tot:=;
  67. for i:= to n do
  68. begin
  69. if tmp+a[i]>ans then
  70. begin
  71. tmp:=a[i];
  72. inc(tot);
  73. last[tot]:=i-;
  74. end else tmp:=tmp+a[i];
  75. end;
  76. for i:=tot+ to m+ do last[i]:=n;
  77. h:=;
  78. for i:= to n do
  79. begin
  80. while s[i]-s[h]>ans do inc(h);
  81. pre[i]:=h;
  82. end;
  83.  
  84. for i:= to last[] do w[,i]:=w[,i-]+;
  85. for i:=last[]+ to last[] do w[,i]:=w[,i-];
  86. l:=;
  87. for i:= to m+ do
  88. begin
  89. k:=l;
  90. l:=k xor ;
  91. w[l,i]:=;
  92. p:=;
  93. for j:=i+ to last[i] do
  94. begin
  95. p:=w[k,j-]-w[k,pre[j]-];
  96. w[l,j]:=(w[l,j-]+p) mod ;
  97. end;
  98. if last[i]=n then ans2:=(ans2+p) mod
  99. else begin
  100. for j:=last[i]+ to last[i+] do w[l,j]:=w[l,j-];
  101. end;
  102. end;
  103. writeln(ans,' ',(ans2 mod +) mod );
  104. 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. 《剑指offer》题解

    有段时间准备找工作,囫囵吞枣地做了<剑指offer>提供的编程习题,下面是题解收集. 当初没写目录真是个坏习惯(-_-)||,自己写的东西都要到处找. 提交的源码可以在此repo中找到:h ...

  2. iOS-合成图片(长图)

    合成图片 直接合成图片还是比较简单的,现在的难点是要把,通过文本输入的一些基本数据也合成到一张图片中,如果有多长图片就合成长图. 现在的实现方法是,把所有的文本消息格式化,然后绘制到一个UILable ...

  3. 30分钟快速搭建Web CRUD的管理平台--django神奇魔法

    加上你的准备的时间,估计30分钟完全够用了,因为最近在做爬虫管理平台,想着快速开发,没想到python web平台下有这么非常方便的框架,简洁而优雅.将自己的一些坑总结出来,方便给大家的使用. 准备环 ...

  4. 用Fluent实现MySQL到ODPS数据集成

    安装ruby 首先通过 /etc/issue 命令查看当前使用centos是哪个版本: [hadoop@hadoop03 ~]$  cat /etc/issue 由于centos版本是6.6,安装ru ...

  5. 机器学习/逻辑回归(logistic regression)/--附python代码

    个人分类: 机器学习 本文为吴恩达<机器学习>课程的读书笔记,并用python实现. 前一篇讲了线性回归,这一篇讲逻辑回归,有了上一篇的基础,这一篇的内容会显得比较简单. 逻辑回归(log ...

  6. LeetCode - 67. Add Binary(4ms)

    Given two binary strings, return their sum (also a binary string). The input strings are both non-em ...

  7. 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 ...

  8. 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 ...

  9. URAL 1936 Roshambo(求期望)

    Description Bootstrap: Wondering how it's played? Will: It's a game of deception. But your bet inclu ...

  10. android仿QQ的SlideMenu

    这其实很简单就可以实现,只需要自定义一个View继承自HorizontalScrollView 1,新建一个项目,再新建一个MySlideMenu继承HorizontalScrollView publ ...