题目:

题目描述

Tar 把一段凹凸不平的路分成了高度不同的 N 段(每一段相同高度),并用 H[i] 表示第 i 段高度。现在 Tar 一共有 n 种泥土可用,它们都能覆盖给定的连续的 k 个部分。
对于第 i 种泥土,它的价格为 C[i],可以使得区间 [i,min(n,i+k-1)] 的路段的高度增加 E[i]。
Tar 要设定一种泥土使用计划,使得使用若干泥土后,这条路最低的高度尽量高,并且这个计划必须满足以下两点要求:
(1)每种泥土只能使用一次。
(2)泥土使用成本必须小于等于 M 。
请求出这个最低的高度最高是多少。

输入格式

第一行为如上文所示的三个正整数:N,M,K。
接下来 N 行,每行3个如上文所示的正整数 H[i],E[i],C[i]。

输出格式

输出有且只有一个数字,为最底部分的高度的最大值。

样例数据 1

输入  [复制]

 

4 20 1 
1 3 5 
1 7 3 
4 6 9 
3 5 13

输出

3

备注

【数据范围】
对于 30% 的数据:N≤20。
对于 100% 的数据:1≤K≤11;1≤N≤100;0≤M,H[i],E[i],C[i]≤1000000。

题解:

引用ssoj官网题解:

二分+DP
二分答案ans,问题转化为了判定性问题。判定的方法是:每个位置都能到达高度ans的最小费用cost是否<=M。
注意到1<=K<=11,也就是说对于第i个路段,能够提高它高度的泥土只有从第i-K个到第i个。于是使用状态压缩动态规划求cost。f[i][j]表示前i个路段通过泥土使用>=高度ans,且第i - k个到第i个的使用情况为二进制数j

注意位运算打括号!!!!!!!

注意dp初始化!!!!!

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cmath>
  5. #include<ctime>
  6. #include<cctype>
  7. #include<cstring>
  8. #include<string>
  9. #include<algorithm>
  10. using namespace std;
  11. const int N=;
  12. const int inf=1e+;
  13. int n,m,k;
  14. int h[N],e[N],c[N];
  15. int bit[];
  16. int dp[N][],g[];
  17. bool jud[N];
  18. inline int R()
  19. {
  20. int f=;
  21. char c;
  22. for(c=getchar();(c<''||c>'');c=getchar());
  23. for(;c<=''&&c>='';c=getchar())
  24. f=(f<<)+(f<<)+c-'';
  25. return f;
  26. }
  27. inline int find(int x)
  28. {
  29. for(int i=k-;i>=;i--)
  30. if(x>=bit[i]) return i;
  31. }
  32. inline bool work(int minn)
  33. {
  34. memset(dp,-,sizeof(dp));
  35. dp[][]=;
  36. memset(jud,false,sizeof(jud));
  37. jud[]=true;
  38. for(int i=;i<=n;i++)
  39. {
  40. if(!jud[i-])
  41. return false;
  42. g[]=;
  43. int maxx=(i<k?bit[i]:bit[k]);
  44. for(int j=;j<maxx;j++)
  45. {
  46. int temp;
  47. if(j==) g[j]=;
  48. else
  49. {
  50. temp=find(j);
  51. g[j]=g[j-bit[temp]]+e[i-temp];
  52. }
  53. if(g[j]+h[i]<minn) continue;
  54. if(dp[i-][j>>]==-&&dp[i-][(j>>)+bit[k-]]==-) continue;
  55. if(dp[i-][j>>]==-)
  56. temp=dp[i-][(j>>)+bit[k-]];
  57. else
  58. {
  59. if(dp[i-][(j>>)+bit[k-]]==-)
  60. temp=dp[i-][j>>];
  61. else
  62. temp=min(dp[i-][j>>],dp[i-][(j>>)+bit[k-]]);
  63. }
  64. dp[i][j]=temp+(j&)*c[i];
  65. if(dp[i][j]>m) dp[i][j]=-;
  66. else jud[i]=true;
  67. }
  68. }
  69. return jud[n];
  70. }
  71. int main()
  72. {
  73. // freopen("a.in","r",stdin);
  74. n=R(),m=R(),k=R();
  75. for(int i=;i<=n;i++)
  76. h[i]=R(),e[i]=R(),c[i]=R();
  77. bit[]=;
  78. for(int i=;i<=k;i++)
  79. bit[i]=bit[i-]*;
  80. int left=inf,right;
  81. for(int i=;i<=n;i++)
  82. left=min(left,h[i]);
  83. right=h[]+e[];
  84. for(int i=;i<=n;i++)
  85. {
  86. int temp=h[i];
  87. for(int j=i;j>=i-k+&&j>=;j--)
  88. temp+=e[j];
  89. right=max(temp,right);
  90. }
  91. int ans=left;
  92. while(left<=right)
  93. {
  94. int mid=(left+right)/;
  95. if(work(mid)) ans=mid,left=mid+;
  96. else right=mid-;
  97. }
  98. cout<<ans<<endl;
  99. return ;
  100. }

刷题总结——道路覆盖(ssoj)的更多相关文章

  1. 刷题总结——探险(ssoj)

    题目: 国家探险队长 Jack 意外弄到了一份秦始皇的藏宝图,于是,探险队一行人便踏上寻宝之旅,去寻找传说中的宝藏. 藏宝点分布在森林的各处,每个点有一个值,表示藏宝的价值.它们之间由一些小路相连,小 ...

  2. 刷题总结——xor(ssoj)

    题目: 题目背景 OURCE:NOIP2015-SHY-7 题目描述 求一棵带边权的树的一条最大 Xor 路径的值.这里的“路径”不一定从根到叶子结点,中间一段路径只要满足条件也可以. 输入格式 第一 ...

  3. 刷题总结——array(ssoj)

    题目: 题目描述 给定 2 个正整数序列 A1, A2,序列长度分别为 L1, L2.你可以进行以下的一次操作:1. 选择两个数 K1,K2(1≤K1≤L1, 1≤K2≤L2):2. 移去 A1 中最 ...

  4. 刷题总结——蜥蜴(ssoj网络流)

    题目: 题目背景 SCOI2007 DAY1 T3 题目描述 在一个 r 行 c 列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外.每行每列中相邻石柱的距 ...

  5. 刷题总结——选课(ssoj树形dp+记忆化搜索+多叉树转二叉树)

    题目: 题目描述 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了 N(N<300)门的选修课程,每个学生可选课程的数量 M 是给定的.学生选修了这M门课 ...

  6. 刷题总结——字符串(ssoj)

    题目: 给定n个小的字符串T和一个大的字符串S,先输出T总共再S中出现了多少次 然后q个询问···每次修改S上的一个字母,然后再次输出上述答案··· n小于1000,q<200000,T的总长度 ...

  7. 刷题总结——run(ssoj)

    题目: 题目描述 企鹅国正在举办全面运动会,第一项比赛就是跑步.N 个人在圆形跑道上跑步,他们都有各自的速度和起点.但这个跑步规则很奇怪,当两个人相遇的时候编号较小的就会出局,当场上剩下最后一个人的时 ...

  8. 刷题总结——work(ssoj)

    题目: 题目背景 SOURCE:NOIP2015-SHY-5 题目描述 假设现在离 noip 还有 m 天,有 n 个人要去参加比赛.他们每个人都有一个预定的训练量 r[i] ,所以每一天他们都抓紧时 ...

  9. 刷题总结——ball(ssoj)

    题目: 题目背景 SOURCE:NOIP2015-SHY-9 题目描述 Alice 与 Bob 在玩游戏.他们一共玩了 t 轮游戏.游戏中,他们分别获得了 n 个和 m 个小球.每个球上有一个分数.每 ...

随机推荐

  1. VM中python2.7运行skier游戏,shell重启问题!!!!!!

    在虚拟机win7系统python2.7,在该python中运行了 父与子中的skier游戏(代码手写), 出现如下问题: ================ RESTART: C:\Python27\S ...

  2. js 分组数组

    思路: 1.先将数组按照一定规则排序: 2.再拆分数组到Map中,按Key分类: 3.再从Map中遍历取出要显示的内容: sortBroadList: function (broadcastList) ...

  3. ABC3D创客项目:国旗

    国旗是一个国家的象征,也是一个民族的骄傲,国旗带给人们的不仅是荣耀,更多的是爱国的情结.看一场天安门的升旗仪式一度成为广大游客去到北京的必有项目,看国旗仪仗队将五星红旗与太阳同时升起,象征着我国充满活 ...

  4. Mybatis-Generator逆向生成Po,Mapper,XMLMAPPER(idea)

    前文有一篇手工生成的说明,地址: http://www.cnblogs.com/xiaolive/p/4874605.html, 现在这个补充一下在idea里面的自动版本的数据库逆向生成工具: 一.g ...

  5. 对于exacoin虚拟币以及其他虚拟币乱象的思考

    今天晚上12点正,我帮两个朋友购买exacoin虚拟币,当然我也购买,为了购买我做了充分的准备,包括使用多个浏览器和准备良好的***代理,并转如足量BTC以支持购买,但是通过三天晚上的奋战,让我感觉这 ...

  6. url地址数据参数转化JSON对象(js三种方法实现)

    当我们用get方法提交表单时,在url上会显示出请求的参数组成的字符串,例如:http://localhost:3000/index.html?phone=12345678901&pwd=12 ...

  7. nginx在windows上面的启动bat文件

    因为windows上面zip安装nginx后启动比较麻烦,然后找了一下关于批处理文件的资料,写了一个nginx启动和关闭的脚本. 这个脚本正常情况下是可以使用的.因为脚本中并没有对nginx程序是否在 ...

  8. 前端css学习记录

    参考资料:CSS权威指南(第三版)中文版 核心要点: HTML负责标记文档的结构(HyperText Markup Language),结构化语言. CSS 负责表现文档的样式(Cascading S ...

  9. PHP发送邮件标题乱码的解决

    遇到问题:PHPMailer发送邮件时中文乱码,本来我的系统都是英文内容的,后来需求变化需要在标题中添加中文,但是在使用安卓自带邮件工具收取是出现乱码,而使用QQ邮箱查看确实正常的. 解决方法: 先用 ...

  10. python logging with yaml

    Recently, I was made a service which can provide a simple way to get best model. so, i spent lot of ...