P2034 选择数字 / P2627 [USACO11OPEN]Mowing the Lawn G
题目描述
给定一行 \(n\) 个非负整数 \(a[1]..a[n]\) 。现在你可以选择其中若干个数,但不能有超过 \(k\) 个连续的数字被选择。你的任务是使得选出的数字的和最大。
输入格式
第一行两个整数 \(n\) ,\(k\)
以下n行,每行一个整数表示 \(a[i]\)。
输出格式
输出一个值表示答案。
输入输出样例
输入 #1
5 2
1
2
3
4
5
输出 #1
12
说明/提示
对于20%的数据,n <= 10
对于另外20%的数据, k = 1
对于60%的数据,n <= 1000
对于100%的数据,1 <= n <= 100000,1 <= k <= n,0 <= 数字大小 <= 1,000,000,000
时间限制500ms
没错,我又来水题啦。
首先,我们会想到 O(\(n^2\) ) 的dp
设 \(f[i]\) 表示从前 \(i\) 个数的最大价值。
那么就会有转移
\(f[i] = max(f[i], f[i-k-1] + sum[i] - sum[i-k+1-1])\) (后面我拆开写主要是为了好理解,实际上化简一下就可以)。
\(k\) 是我们枚举的要选的连续的数的个数,即区间长度。
这样肯定会 TLE 得啦。
但有没有觉得这个柿子很熟悉,这不就是求 \(i-k-1 , i\) 的最大值。
直接上单调队列优化,记得一开始要把前 \(k\) 个点先入队,在去更新其他的。
我们更新 \(i\) 的时候,要先把 \(i\) 入队在更新,因为他可以取到 \(i\) 也就相当于不选这个数。
Code
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define int long long
int n,k,x,head,tail;
int sum[100010],f[100010],q[100010];
inline int read()
{
int s = 0, w = 1; char ch = getchar();
while(ch < '0' || ch > '9'){if(ch == '-') w = -1; ch = getchar();}
while(ch >= '0' && ch <= '9'){s =s * 10+ch - '0'; ch = getchar();}
return s * w;
}
signed main()
{
n = read(); k = read();
for(int i = 1; i <= n; i++)
{
x = read();
sum[i] = sum[i-1] + x;//维护一个前缀和
}
head = 1, tail = 0;
q[++tail] = 0;
for(int i = 1; i <= k; i++)//先把前k的点入队
{
f[i] = sum[i];
while(head <= tail && f[q[tail] - 1] - sum[q[tail]] <= f[i-1] - sum[i]) tail--;
q[++tail] = i;
}
for(int i = k+1; i <= n; i++)
{
while(head <= tail && q[head] < i - k) head++;//把过期的扔掉
while(head <= tail && f[q[tail]-1] - sum[q[tail]] <= f[i-1] - sum[i]) tail--;//把不优的情况也扔掉
q[++tail] = i; //先入队在更新
f[i] = f[q[head]-1] + sum[i] - sum[q[head]];
}
printf("%lld\n",f[n]);
return 0;
}
另外还有一道双倍经验的题 P2627 [USACO11OPEN]Mowing the Lawn G。
这个题和上面那道题差不多,只不过有个小细节是要让节点先更新在入队(至于为什么自己可以想想)。
P2034 选择数字 / P2627 [USACO11OPEN]Mowing the Lawn G的更多相关文章
- 洛谷P2627 [USACO11OPEN]Mowing the Lawn G (单调队列优化DP)
一道单调队列优化DP的入门题. f[i]表示到第i头牛时获得的最大效率. 状态转移方程:f[i]=max(f[j-1]-sum[j])+sum[i] ,i-k<=j<=i.j的意义表示断点 ...
- P2034 选择数字
P2034 选择数字 题目描述 给定一行n个非负整数a[1]..a[n].现在你可以选择其中若干个数,但不能有超过k个连续的数字被选择.你的任务是使得选出的数字的和最大. 错误日志: longlong ...
- 「单调队列优化DP」P2034 选择数字
「单调队列优化DP」P2034 选择数字 题面描述: 给定一行n个非负整数a[1]..a[n].现在你可以选择其中若干个数,但不能有超过k个连续的数字被选择.你的任务是使得选出的数字的和最大. 输入格 ...
- P2034 选择数字——线性dp(单调队列优化)
选择数字 题目描述 给定一行 \(n\) 个非负整数 \(a[1]...a[n]\) .现在你可以选择其中若干个数,但不能有超过 \(k\) 个连续的数字被选择.你的任务是使得选出的数字的和最大. 输 ...
- codevs 3327 选择数字
3327 选择数字 时间限制: 1 s 空间限制: 256000 KB 题目描述 Description 给定一行n个非负整数a[1]..a[n].现在你可以选择其中若干个数,但不能有超过k个连续 ...
- input只读属性 设置和移除 选择数字
设置只读属性 $('#stage').attr("readonly", "readonly"); 移除 只读属性 $("input").r ...
- codevs3327选择数字(单调队列优化)
3327 选择数字 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 给定一行n个非负整数a[1]..a[n].现 ...
- 科普:为什么 String hashCode 方法选择数字31作为乘子
作者:coolblog 此文章转载自:https://segmentfault.com/a/1190000010799123 1. 背景 某天,我在写代码的时候,无意中点开了 String hashC ...
- 选择数字(codevs 3327)
题目描述 Description 给定一行n个非负整数a[1]..a[n].现在你可以选择其中若干个数,但不能有超过k个连续的数字被选择.你的任务是使得选出的数字的和最大. 输入描述 Input De ...
随机推荐
- 万级K8s集群背后etcd稳定性及性能优化实践
背景与挑战 随着腾讯自研上云及公有云用户的迅速增长,一方面,腾讯云容器服务TKE服务数量和核数大幅增长, 另一方面我们提供的容器服务类型(TKE托管及独立集群.EKS弹性集群.edge边缘计算集群.m ...
- css动画 loading
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 08_线程间通信 ITC
1.线程间的通信方式 1.共享全局变量 2.线程队列(queue) 3.信号量(Semaphore) 2.共享全局变量进行通信 from threading import Thread import ...
- Zabbix Server宕机报“__zbx_mem_malloc(): out of memory (requested 96 bytes)”
早上登录Zabbix的时候,发现其提示"Zabbix server is not running: the information displayed may not be current& ...
- 在Python程序中执行linux命令
import commands print commands.getstatusoutput('ls') 输出: (0, '1.py\nwork.nfs') 参考文档: https://blog.cs ...
- IDEA编写JavaWeb出现乱码,成功解决!
使用IDEA写JavaWeb项目时,总会出现编码出错等问题,比如下面这样,页面显示出来一大堆乱码,下面跟着我来操作一下,可以成功解决! 首先在IDEA安装目录下有一个:bin的文件夹,打开后找到如下两 ...
- Java 后端开发常用的 10 种第三方服务
请肆无忌惮地点赞吧,微信搜索[沉默王二]关注这个在九朝古都洛阳苟且偷生的程序员.本文 GitHub github.com/itwanger 已收录,里面还有我精心为你准备的一线大厂面试题. 严格意义上 ...
- taro-script 0.4 发布,基于Taro v3的js解释器组件
taro-script Github地址 基于Taro v3开发,支持多端小程序动态加载远程 JavaScript 脚本并执行,支持 ES5 语法 最近更新内容 新增useScriptContext获 ...
- Docker容器监控(十)
docker自带的监控命令 docker自带了三个监控命令即ps, top, stats ps docker ps 可以帮助我们很快的了解当前正在运行的容器 -a:会显示已经停掉的容器 [root ...
- Jmeter引用外部jar包的几种方法
总结记录下jmeter引用外部jar包的3种方法及其优缺点: 一.测试计划中添加目录或jar包到Classpath 操作:测试计划->添加目录或jar包到Classpath-->浏览导入j ...