P2627 修剪草坪

题目描述

在一年前赢得了小镇的最佳草坪比赛后,Farm John变得很懒,再也没有修剪过草坪。现在,新一轮的最佳草坪比赛又开始了,Farm John希望能够再次夺冠。

然而,Farm John的草坪非常脏乱,因此,Farm John只能够让他的奶牛来完成这项工作。Farm John有N(1 <= N <= 100,000)只排成一排的奶牛,编号为1...N。每只奶牛的效率是不同的,奶牛i的效率为E_i(0 <= E_i <= 1,000,000,000)。

靠近的奶牛们很熟悉,因此,如果Farm John安排超过K只连续的奶牛,那么,这些奶牛就会罢工去开派对:)。因此,现在Farm John需要你的帮助,计算FJ可以得到的最大效率,并且该方案中没有连续的超过K只奶牛。

输入输出格式

输入格式:

第一行:空格隔开的两个整数 N 和 K

第二到 N+1 行:第 i+1 行有一个整数 E_i

输出格式:

第一行:一个值,表示 Farm John 可以得到的最大的效率值。


观察问题,转化为满足合法的条件下,舍去效率的点尽可能小

\(dp[i]\) 表示: 前 \(1 ~ i\) 满足条件合法, 且一定舍弃了第 \(i\) 个 舍去的最小效率

我们需要一点 动归中的贪心思想, 最后合法的方案一定是:选尽可能多个——一个断点——继续选连续的尽可能多的, 断点保证了连续的奶牛不大于 \(k\) 个,在这个条件下尽可能多选, 而我们的 \(dp[i]\) 弄的就是这样一个断点, 因为连续的牛不能超过 \(k\) 个,那么两断点之间应有什么联系呢?考虑边缘情况, \(i\) 和 \(j\)之间恰好夹着一个长度为 \(k\) 的区间,则有 \(i - j = k +1\) 所以我们得到 \(j\) 与 \(i\) 的关系: \(1 <= i - j <= k + 1\) 并得到状态转移方程$$dp[i] = min(dp[j]\ \ {1 <= i - j <= k + 1}) + v[i]$$

由于 \(min(dp[j]\ \ {1 <= i - j <= k + 1}\) 的取值在一个区间内, 考虑单调队列优化 \(dp\)。

推完所有 \(dp\) 后,考虑最后一个区间:最后一个区间合法,只要在 \(n - k\) 之后有断点即可(画图), 所以我们枚举在 \(n - k\) 之后的每一个 \(dp\) 或者说直接可以利用刚才的的单调队列, 查询这段区间的最小值, 用全部权值减去这一最小值即为答案

附:考场小技巧:此题中出现大量端点问题, 比赛时多画图, 比凭空想端点来的快得多, 也稳

Code

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
LL RD(){
LL flag = 1, out = 0;char c = getchar();
while(c < '0' || c > '9'){if(c == '-')flag = -1;c = getchar();}
while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
return flag * out;
}
const LL maxn = 100019;
LL num, k, sum;
LL dp[maxn];//表示前i个人的合法情况下的去掉的最小值
LL v[maxn];
struct Que{
LL index, val;
Que (LL index, LL val):index(index), val(val){}
Que(){};
}Q[maxn];
LL head = 1, tail = 0;
LL get_min(){return Q[head].val;}
void push_back(LL x){
while(head <= tail && dp[x] <= Q[tail].val)tail--;
Q[++tail] = Que(x, dp[x]);
}
void check(LL x){
while(x - Q[head].index > k + 1)head++;
}
int main(){
num = RD();k = RD();
for(LL i = 1;i <= num;i++)v[i] = RD(), sum += v[i];
for(LL i = 1;i <= k + 1;i++)dp[i] = v[i], push_back(i);
for(LL i = k + 2;i <= num;i++){
check(i);
dp[i] = get_min() + v[i];
push_back(i);
}
check(num + 1);
printf("%lld\n", sum - get_min());
return 0;
}

P2627 修剪草坪的更多相关文章

  1. 洛谷 P2627 修剪草坪 题解

    P2627 修剪草坪 题目描述 在一年前赢得了小镇的最佳草坪比赛后,Farm John变得很懒,再也没有修剪过草坪.现在,新一轮的最佳草坪比赛又开始了,Farm John希望能够再次夺冠. 然而,Fa ...

  2. [洛谷P2627] 修剪草坪

    传送门:>Here< 题意:不能有连续超过$k$个奶牛的一段,求最大的和 思路分析 Dp还是容易看出来的. 我的第一感觉是一维,$f[i]$表示前i头奶牛的最大效率.其实这也是可以解的,具 ...

  3. luogu P2627 修剪草坪

    传送门 单调队列优化dp板子 表示不大想写详细做法,自己看代码吧qwq (懒) 注意细节,不然就会跟我一样WA4次 // luogu-judger-enable-o2 #include<bits ...

  4. P2627 修剪草坪 (单调队列优化$dp$)

    题目链接 Solution 70分很简单的DP,复杂度 O(NK). 方程如下: \[f[i][1]=max(f[j][0]+sum[i]-sum[j])\]\[f[i][0]=max(f[i-1][ ...

  5. usaco 购买饲料 && 修剪草坪

    购买饲料 Description 如约翰在镇上,沿着公路开车回家,他的家离起点有E公里.他顺便准备买K吨饲料回家.运送饲料是要花油钱的,如果他的车上有X吨饲料,行驶一公里需要X^2元,行驶D公里就 需 ...

  6. BZOJ2442: [Usaco2011 Open]修剪草坪

    2442: [Usaco2011 Open]修剪草坪 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 500  Solved: 244[Submit][ ...

  7. BZOJ 2442: [Usaco2011 Open]修剪草坪( dp )

    dp dp[ i ] 表示第 i 个不选 , 前 i 个的选择合法的最小损失 , dp[ i ] = min( dp[ j ] ) ( max( 0 , i - 1 - k ) <= j < ...

  8. bzoj2442[Usaco2011 Open]修剪草坪 单调队列优化dp

    2442: [Usaco2011 Open]修剪草坪 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1159  Solved: 593[Submit] ...

  9. BZOJ_2343_[Usaco2011 Open]修剪草坪 _单调队列_DP

    BZOJ_2343_[Usaco2011 Open]修剪草坪 _单调队列_DP 题意: N头牛,每头牛有一个权值,选择一些牛,要求连续的不能超过k个,求选择牛的权值和最大值 分析: 先考虑暴力DP,f ...

随机推荐

  1. cocos2d-x 相关文章资源(安卓开发)

    http://blog.csdn.net/sdhjob/article/details/38734993 http://www.cnblogs.com/code4app/p/4026665.html ...

  2. flownet2.0 caffe anaconda2 编译安装

    1. 下载flownet2.0源码到指定目录 cd /home/zzq/saliency_models/deep_optical_flow git clone https://github.com/l ...

  3. 使用成员资格管理用户Membership

    ASP.NET成员资格使您可以验证和管理Web应用程序的用户信息.它提供验证用户凭据,创建和修改成员资格用户以及管理用户设置(如密码和电子邮件地址)的功能. ASP.NET成员资格主要用于ASP.NE ...

  4. java集合ArrayList

    基于jdk_1.8.0 关于List,主要是有序的可重复的数据结构.jdk主要实现类有ArrayList(底层使用数组).LinkedList(底层使用双向链表) ArrayList: (一)继承关系 ...

  5. 简单的树(summary)

    实验任务 可怜的 Bibi 丢了好几台手机以后,看谁都像是小偷,他已经在小本本上记下了他认为的各个地点的小偷数量. 现在我们将Bibi的家附近的地形抽象成一棵有根树.每个地点都是树上的 一个节点,节点 ...

  6. 关于Keil C关键字xdata和data的问题

    1.xdata表示这是一个外部RAM地址内的数据,数据最终将被保存至外部RAM的某个地址单元中:但是,外部RAM只能通过寄存器间接寻址来访问,也就是说,其地址需要保存在内部RAM中(其实或许是SFR中 ...

  7. HBase 架构与工作原理1 - HBase 的数据模型

    本文系转载,如有侵权,请联系我:likui0913@gmail.com 一.应用场景 HBase 与 Google 的 BigTable 极为相似,可以说 HBase 就是根据 BigTable 设计 ...

  8. 多线程同步与并发访问共享资源工具—Lock、Monitor、Mutex、Semaphore

    “线程同步”的含义   当一个进程启动了多个线程时,如果需要控制这些线程的推进顺序(比如A线程必须等待B和C线程执行完毕之后才能继续执行),则称这些线程需要进行“线程同步(thread synchro ...

  9. NOIP2017 心路历程

    虽然没能去考试,但是在学弟们考试前后也发生了很多事情. 周四晚上.学弟们出发前最后一天.单独找几个人谈了谈.面对退役他们还是有点慌啊.这个时候给他们调整心态或许有点迟了. 21:45.最后一分钟.为他 ...

  10. java中的变量各占得字节数

    boolen,8位1个字节int,32位,4个字节float,32位 4个字节double,64位8个字节char 16位,2个字节byte 8位1个字节short 16位 2个字节long 64位 ...