P2627 修剪草坪
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 修剪草坪的更多相关文章
- 洛谷 P2627 修剪草坪 题解
P2627 修剪草坪 题目描述 在一年前赢得了小镇的最佳草坪比赛后,Farm John变得很懒,再也没有修剪过草坪.现在,新一轮的最佳草坪比赛又开始了,Farm John希望能够再次夺冠. 然而,Fa ...
- [洛谷P2627] 修剪草坪
传送门:>Here< 题意:不能有连续超过$k$个奶牛的一段,求最大的和 思路分析 Dp还是容易看出来的. 我的第一感觉是一维,$f[i]$表示前i头奶牛的最大效率.其实这也是可以解的,具 ...
- luogu P2627 修剪草坪
传送门 单调队列优化dp板子 表示不大想写详细做法,自己看代码吧qwq (懒) 注意细节,不然就会跟我一样WA4次 // luogu-judger-enable-o2 #include<bits ...
- 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][ ...
- usaco 购买饲料 && 修剪草坪
购买饲料 Description 如约翰在镇上,沿着公路开车回家,他的家离起点有E公里.他顺便准备买K吨饲料回家.运送饲料是要花油钱的,如果他的车上有X吨饲料,行驶一公里需要X^2元,行驶D公里就 需 ...
- BZOJ2442: [Usaco2011 Open]修剪草坪
2442: [Usaco2011 Open]修剪草坪 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 500 Solved: 244[Submit][ ...
- BZOJ 2442: [Usaco2011 Open]修剪草坪( dp )
dp dp[ i ] 表示第 i 个不选 , 前 i 个的选择合法的最小损失 , dp[ i ] = min( dp[ j ] ) ( max( 0 , i - 1 - k ) <= j < ...
- bzoj2442[Usaco2011 Open]修剪草坪 单调队列优化dp
2442: [Usaco2011 Open]修剪草坪 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1159 Solved: 593[Submit] ...
- BZOJ_2343_[Usaco2011 Open]修剪草坪 _单调队列_DP
BZOJ_2343_[Usaco2011 Open]修剪草坪 _单调队列_DP 题意: N头牛,每头牛有一个权值,选择一些牛,要求连续的不能超过k个,求选择牛的权值和最大值 分析: 先考虑暴力DP,f ...
随机推荐
- 软件工程-东北师大站-第九次作业(PSP)
1.本周PSP 2.本周进度条 3.本周累计进度图 代码累计折线图 博文字数累计折线图 4.本周PSP饼状图
- Aspose.words Java基于模板生成word之循环图片
1.新建一个word文档 2.给插入图片的地方设置书签 3,设置书签 二,项目 1,2步的引入依赖以及加载授权文件同上一篇 3,获取图片路径插入到word中并生成新的word文档 新文档中,每行显示两 ...
- 四则运算2及PSP0设计项目计划
时间比较紧,我简单写写我的设计思路: 题目在四则运算1的基础上控制产生题目的数量,这个可以用变量控制:打印方式也可选用变量控制,程序的关键是括号的生成.我们可以将整个四则运算式看成()+()的模型,然 ...
- 四则运算结对项目之GUI
本次结对编程让我学到了许多许多知识,受益匪浅!在此之前,我没想过我能做出一个双击运行的小程序. 感谢我的队友与我同心协力,感谢室友宇欣告诉我操作符为“最多多少”而不是“多少”并教我使用效能分析工具,感 ...
- iOS- CALayer绘图,如何绘制渐变效果图
1.渐变效果 —> 色彩空间 首先:自定义一个渐变视图,在自定义视图中重写drawRect #import "ViewController.h" #import " ...
- vue 中ref 的使用注意事项
最近看别人的项目发现有些语法不能理解,所以百度进行了学习.现在总结一下. ref 有两种用法 1.ref 加在普通的元素上,用this.ref.name 获取到的是dom元素 2.ref 加在子组件上 ...
- BeTa阶段Day4
一.提供当天站立式会议照片一张 二.每个人的工作 1.讨论项目每个成员的昨天进展 刘阳航:优化障碍物生成. 林庭亦:调整难度设置. 郑子熙:改进UI,美化界面. 陈文俊:优化代码结构. 2.讨论项目每 ...
- 第六周PSP&进度条
团队项目PSP 一.表格: C类型 C内容 S开始时间 E结束时间 I时间间隔 T净时间(mins) 预计花费时间(mins) 讨论 讨论alpha完成情况并总结 9:40 11:20 17 ...
- UDJC用户自定义Java类
private RowSet t1 = null;//业务表步骤 private RowSet t2 = null;//删除步骤 public boolean processRow(StepMetaI ...
- PHP开发网站,你是如何提高其网站的安全性的?
一.网站程序问题 很多网站的安全问题大多是由于网站程序存在漏洞,所以想要提高网站安全性,必须要选择安全的后台cms系统,若有能力可以自己去开发网站后台,这样安全性能得到极大的提高,若是从网上选择一些免 ...