Link

  https://jzoj.net/senior/#main/show/3521

Description

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

Solution

30分

  事实上,数据是允许拿到90分的,我们直接跑一次递归就可以了,记录最低值的最高值

100分

  这个的状压DP很巧妙,从来没做过这种不需要存所有状态的状压DP

  从“最低的高度最高”就可以看出,这道题是用二分的,正解就是二分答案。

  从而,我们就把这道题目变为一道判定性的问题,给出一个mid,问你是否符合上面的题意。

  普通方法使用递归判断可行性

  既然可以用递归,那么显然可以用动态规划。

  我们设F[i,s]表示你当前想选第i种泥土,前面k种的状态(包括i)是什么,用二进制表示,,0表示在那个位置没用了泥土,1表示用了。(用没用表示从他开始往后铺,专属于他的泥土)一定要看下面第二个图

  我们用当前F[i,s]去更新F[i+1,s1]

  关键是我们怎么转移。

  对于每一种泥土,只有选和不选两种状态,那么我们只要考虑这两种情况就可以了

  在此之前,我们先看一个东西

  

  注意,我们这里是用i,更新i+1

  读图可以发现,对i+1有影响的只有从i前k-1个(包括i)

  可以发现,只有i包括i的前k-1个对i+1是有影响的。

  因为你选到i时,状态是s,那么,如果从i更新到i+1,状态就是s去掉最后一位,也就是(s>>1),其实就是s/2

  我们统计s状态中,有哪个地方是选了泥土的,然后记录一下,他们一共会让i+1这个位置的土地高多少,设这个数为num,要多看图,多写草稿

  为什么呢,因为前面的加了对应的e数组的某一个值,又因为它会影响到当前这个位置,看上图,所以,我们要看看,他们究竟影响到i+1这个位置增加多少值,所以我们要提前记录下来

  其中S是枚举的!枚举的!枚举的!

  

  ①不选

  如果不选,那么num+h[i]必定是大于等于mid的,这样才符合题目要求,如果不懂反复读上面的那句话,看看我画出来精美的图,就知道了。不懂都会懂

  满足的上面的情况,我们就可以转移了

  f[i+1,s>>1]:=min(f[i+1,s>>1],f[i,s]) 

  ②选

  如果选,就要满足num+h[i]+E[i]是大于等于mid的,同理也是上面所说

  那么当前的位置s状态中i+1的位置应该是1,所以,我们就是要更新新的s

  f[i+1,s>>1 or 1 shl (k-1)]:=min(f[i+1,s>>1 or 1 shl (k-1)],f[i,j]+c[i]);

  最后答案的判断就是判断有没有一个被更改过值得f[n,i](i是状态)是小于等于m的,因为在前面的操作中,都保证了更新过的f数组是符合题目要求的

  这道题充分的体现了动态规划的屌

Code

uses math;
var
n,m,k,i,j,l,r,mid:longint;
a,b,c:array[..] of longint;
f:array[..,..] of longint;
function pd(x:longint):boolean;
var
i,j,jj,num:longint;
begin
fillchar(f,sizeof(f),); f[,]:=; for i:= to n- do
begin
for j:= to shl k- do
if f[i,j]<>- then
begin
num:=;
for jj:=k- downto do
if ( shl(jj)) and j<> then
inc(num,b[i-(k-jj-)]); if num+a[i+]>=x then
if f[i+,j shr ]<>- then
f[i+,j shr ]:=min(f[i+,j shr ],f[i,j])
else
f[i+,j shr ]:=f[i,j]; if num+a[i+]+b[i+]>=x then
if f[i+,j shr + shl (k-)]<>- then
f[i+,j shr + shl (k-)]:=min(f[i+,j shr + shl (k-)],f[i,j]+c[i+])
else
f[i+,j shr + shl (k-)]:=f[i,j]+c[i+];
end;
end; for i:= to shl k- do
if f[n,i]<>- then
if f[n,i]<=m then
exit(true); exit(false); end;
begin
assign(input,'cover.in');reset(input);
assign(output,'cover.out');rewrite(output);
readln(n,m,k);
for i:= to n do
readln(a[i],b[i],c[i]); l:=;
r:=maxlongint-;
while l<=r do
begin
mid:=(l+r) shr ; if pd(mid) then
l:=mid+
else
r:=mid-;
end; writeln(l-);
end.

[jzoj]3521.道路覆盖(cover)的更多相关文章

  1. JZOJ 3521. 道路覆盖

    Description ar把一段凹凸不平的路分成了高度不同的N段,并用H[i]表示第i段高度.现在Tar一共有n种泥土可用,它们都能覆盖给定的连续的k个部分. 对于第i种泥土,它的价格为C[i],可 ...

  2. 刷题总结——道路覆盖(ssoj)

    题目: 题目描述 Tar 把一段凹凸不平的路分成了高度不同的 N 段(每一段相同高度),并用 H[i] 表示第 i 段高度.现在 Tar 一共有 n 种泥土可用,它们都能覆盖给定的连续的 k 个部分. ...

  3. [JZOJ3521]道路覆盖--状压DP

    题目链接 略略略 分析 首先一看到使得最低的高度最高就想到了二分,于是就转化成了一个是否可行的问题 发现这个\(k\)都很小,考虑使用状态压缩DP 但是我一开始发现似乎并不好设计状态...如果这个\( ...

  4. [JZOJ NOIP2018模拟10.20 B组]

    T1:原根(math) 题目链接: http://172.16.0.132/senior/#contest/show/2532/0 题目: 题解: 一个数m原根的个数是$\phi{(\phi{(m)} ...

  5. 2017.07.07【NOIP提高组】模拟赛B组

    Summary 因为某种无法抗拒的原因,今天没有打比赛,所以也就没有那种心态.今天的题目有状压DP和二分,这套题不难也不简单,适中,适合我这种渣渣来做.在改题时,发现了许多问题.我连欧拉函数的计算都记 ...

  6. 深入浅出SQL Server中的死锁

    简介 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相关观念有一个理解. 一些基础知识 要理解SQL Server中的死锁,更好的方式是通过类比从更大的面理 ...

  7. SQL Server中的死锁

    简介 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相关观念有一个理解. 一些基础知识 要理解SQL Server中的死锁,更好的方式是通过类比从更大的面理 ...

  8. 深入浅出SQL Server中的死锁(实战篇)

    简介 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相关观念有一个理解. 一些基础知识 要理解SQL Server中的死锁,更好的方式是通过类比从更大的面理 ...

  9. T-SQL查询进阶--SQL Server中的事务与锁

    为什么需要锁 在任何多用户的数据库中,必须有一套用于数据修改的一致的规则,当两个不同的进程试图同时修改同一份数据时,数据库管理系统(DBMS)负责解决它们之间潜在的冲突.任何关系数据库必须支持事务的A ...

随机推荐

  1. windows10的文件浏览器中无法搜索文件内容

    系统:更新到最新的win10(2018年8月23日 23:54:31) 重现步骤:git clone一个项目,然后切换到它的另一个分支:打开文件夹浏览器(explorer),在右上角里输入想要查找的字 ...

  2. ubuntu下的“用vim打开中文乱码,用cat打开正常显示”的解决方法

    转载 系统环境:ubuntu10.04 vim gvim完全安装 问题:终端下vim中的汉字为乱码,网上搜索了一些解决方案.但是奇怪的是,这些方法都不能实现gvim的菜单和文中汉字,终端vim下的文中 ...

  3. ASP.NET Core Http请求的处理流程

  4. JSP中三大指令

    JSP指令概述 JSP指令的格式:<%@指令名 attr1=”” attr2=”” %>,一般都会把JSP指令放到JSP文件的最上方,但这不是必须的.  JSP中的指令共有三个:page. ...

  5. react-native-video

    <Video ref='videoPlayer' source={{uri:'http://www.thinktown.com/video/th.mp4'}} //网络视频 //source={ ...

  6. jenkins(1): jenkins安装以及从gitlab拉取代码

    1. gitlab前面已经写过了,自己去参考 https://www.cnblogs.com/yitianyouyitian/p/9214940.html 2. jenkins安装 2.1 jdk 安 ...

  7. Codeforces 982E Billiard 扩展欧几里德

    原文链接http://www.cnblogs.com/zhouzhendong/p/9055728.html 题目传送门 - Codeforces 928E 题意 一束与坐标轴平行或者成$45^\ci ...

  8. HDU4343Interval query 倍增

    去博客园看该题解 题意 给定n个区间[a,b),都是左闭右开,有m次询问,每次询问你最多可以从n个区间中选出多少[L,R]的子区间,使得他们互不相交. n,m<=10^5. 区间下标<=1 ...

  9. springboot学习——第二集:整合Mybaits

    1,Mybatis动态插入(insert)数据(使用trim标签):https://blog.csdn.net/h12kjgj/article/details/55003713 2,mybatis 中 ...

  10. Python交互图表可视化Bokeh:4. 折线图| 面积图

    折线图与面积图 ① 单线图.多线图② 面积图.堆叠面积图 1. 折线图--单线图 import numpy as np import pandas as pd import matplotlib.py ...