P1714切蛋糕(不定区间最值)
题面
今天是小Z的生日,同学们为他带来了一块蛋糕。这块蛋糕是一个长方体,被用不同色彩分成了N个相同的小块,每小块都有对应的幸运值。
小Z作为寿星,自然希望吃到的第一块蛋糕的幸运值总和最大,但小Z最多又只能吃M小块(M≤N)的蛋糕。
吃东西自然就不想思考了,于是小Z把这个任务扔给了学OI的你,请你帮他从这N小块中找出连续的k块蛋糕(k≤M),使得其上的幸运值最大。
不定区间长度还是第一次遇到
分析 考虑朴素写法,非常直观。
对于以第i个元素结尾的子段,最大的子段和P(i)可以表示为
P [ i ] = max { sum [ i ] - sum [ j ] , j 属于 [ i-M, i-1 ]
于是有ans = max [ P [ i ] ]
算法的复杂度是O ( N M )
在题目的范围下TLE是必然的
将上面P[i]的计算式改写为
P [ i ] = sum [ i ] - min { sum [ j ] },j属于 [ i-M , i-1 ]
显然,在每次获取 P [ i ] 的时候,Sum [ i ] 是定值,所以 P [ i ] 由 Sum [ j ] 的最小值确定。
于是我们就要想方设法在优于O(M)的时间内实现获取最小的 Sum [ j ] 。
最优时,Sum [ j ] 的性质:
(1)Sum [ j ] ≤ Sum [ x ] x∈ [ i-M , i-1 ]且x≠j
(2)j∈[ i-M , i-1 ]
枚举加优化
考虑设计这样一个数据结构,在更低的时间复杂度内获取最优Sum [ j ] 。
①单调队列
#include <iostream>
using namespace std;
#define max(a,b) (a>b?a:b)
const int maxn=;
int a[maxn],zhui[maxn];
int q[maxn],p[maxn],ans=-,spfa[maxn];
int main()
{
int n,m,tail=,head=;
cin>>n>>m;
for(int i=;i<=n;i++)
{
cin>>a[i];
zhui[i]=zhui[i-]+a[i];
}
for(int i=;i<=n;i++)
{
while(tail>=head&&q[tail]>=zhui[i]) tail--;
q[++tail]=zhui[i];p[tail]=i;
while(p[head]+m<=i) head++;
spfa[i]=q[head];
}
for(int i=;i<=n;i++)
ans=max(ans,zhui[i]-spfa[i-]);
cout<<ans;
}
②ST稀疏表
#include <bits/stdc++.h>
using namespace std;
const int maxn=;
int a[maxn],zhui[maxn];
int ans=-,dis[maxn][];
int query(int l,int r){
int k=log2(r-l+);
return min(dis[l][k],dis[r+-(<<k)][k]);
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=;i<=n;i++)
{
int t;
cin>>t;
zhui[i]=zhui[i-]+t;
dis[i][]=zhui[i];
}
for(int j=;j<=log2(n);j++)
{
for(int i=;i+(<<j)-<=n;i++)
dis[i][j]=min(dis[i][j-],dis[i+(<<(j-))][j-]);
}
for(int i=;i<=n;i++)
{
int l=i-m;//等于是求i-m+1到第i项
if(l<) l=;
ans=max(ans,zhui[i]-query(l,i));
}
cout<<ans;
}
P1714切蛋糕(不定区间最值)的更多相关文章
- 洛谷 P1714 切蛋糕 题解
P1714 切蛋糕 题目描述 今天是小Z的生日,同学们为他带来了一块蛋糕.这块蛋糕是一个长方体,被用不同色彩分成了N个相同的小块,每小块都有对应的幸运值. 小Z作为寿星,自然希望吃到的第一块蛋糕的幸运 ...
- 洛谷 P1714 切蛋糕 单调队列
这个题比较显然,要用前缀和来做.但只用前缀和是过不去的,会TLE,所以需要进行优化. 对于每个前缀和数组 b 中的元素,都可以找到以 b[i] 结尾的子段最大值 p[i],显然,最终的 ans 就是 ...
- 【洛谷】【动态规划+单调队列】P1714 切蛋糕
[题目描述:] 今天是小Z的生日,同学们为他带来了一块蛋糕.这块蛋糕是一个长方体,被用不同色彩分成了N个相同的小块,每小块都有对应的幸运值. 小Z作为寿星,自然希望吃到的第一块蛋糕的幸运值总和最大,但 ...
- P1714 切蛋糕 单调队列
题目: 题目描述 今天是小Z的生日,同学们为他带来了一块蛋糕.这块蛋糕是一个长方体,被用不同色彩分成了N个相同的小块,每小块都有对应的幸运值. 小Z作为寿星,自然希望吃到的第一块蛋糕的幸运值总和最大, ...
- 洛谷—— P1714 切蛋糕
https://www.luogu.org/problem/show?pid=1714 题目描述 今天是小Z的生日,同学们为他带来了一块蛋糕.这块蛋糕是一个长方体,被用不同色彩分成了N个相同的小块,每 ...
- P1714 切蛋糕 dp+单调队列
题意: 题目描述 在幻想乡,琪露诺是以笨蛋闻名的冰之妖精. 某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来.但是这只青蛙比以往的要聪明许多,在琪露诺来之前就已经跑到了河的对岸.于是琪露诺决定到 ...
- [洛谷P1714]切蛋糕
题目大意:给你n个整数,求出其中长度不超过m的最大字段和. 题解:单调队列维护前缀和最小值,然后用当前值减去当前有效最小值即可 C++ Code: #include<cstdio> usi ...
- 洛谷P1714切蛋糕
题目 该题目就是求这n个数的前缀和所组成的数组的所有子区间的左端点和右端点相差不超过m,且他们的前缀和差最大,求出这个最大值即可. 而朴素算法肯定会T,而我们发现如果前缀和最大的话,则前缀和的值一定是 ...
- 洛谷P1714 切蛋糕(单调队列)
先放代码...... 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=5e5+10,M=0x3f3f3f3f; ...
随机推荐
- Java 数据类型转换的骚操作和神奇现象
问:银行用什么数据类型来表示余额?float还是double? 都不是!!下面说明为什么都不可以呢? public static void main(String[] args) { //浮点数他都是 ...
- layoutInflater参数解析与源码分析
关于LayoutInflater方法,无论是在listview的适配器中,还是在动态添加view的时候,都会出现它的身影,最开始我在看<第一行代码>时,不知道这个方法实际的参数到底指的是什 ...
- Python 小技之实现的鲜花盛宴,你准备好了吗?
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:派森酱 PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...
- java对象头信息和三种锁的性能对比
java头的信息分析 首先为什么我要去研究java的对象头呢? 这里截取一张hotspot的源码当中的注释 这张图换成可读的表格如下 |-------------------------------- ...
- sws_接口自动化_demo
登录接口获取token: import requests import json def get_token(username, password): host = "https://sws ...
- [javascript] js实现小数的算术运算方法
/** ** 加法函数,用来得到精确的加法结果 ** 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加法结果. ** 调用:accAdd(arg ...
- java IO流 之 字节流与字符流
其实学习了file文件基础类,后面的字节流和字符流都特别简单了,首先需要知道字节流和字符流的区别 字节流: 用来传送图片.各种文件.大文件.文本都是通过字节流进行传输的. 字符流: 只能读取文本信息 ...
- 挑战全网最幽默的Vuex系列教程:第三讲 Vuex旗下的Mutation
写在前面 上一讲「Vuex 旗下的 State 和 Getter」,告诉了我们怎么去使用仓库 store 中的状态数据.当然,光会用肯定还不够,大部分的应用场景还得对这些状态进行操控,那么具体如何操控 ...
- 对JavaScript中原型及原型链的理解
什么是原型: 1,我们所创建的每一个函数,解析器都会向该函数对象添加一个属性prototype,这个属性指向一个对象,这个对象就是我们所谓的原型对象 2,如果我们将函数作为普通函数调用时,proto ...
- CSS中“~”(波浪号)、“,”(逗号)、“+”(加号)、“>”(大于号)、“ ”(空格)详解
“~”:$('pre ~ brother')表示获取pre节点的后面的所有兄弟节点,相当于nextAll()方法: “+”:$('pre + nextbrother')表示获得pre节点的下一个兄弟节 ...