NCSTOJ:V : 蛋糕的最大幸运值

时间:2019-04-19
本文章向大家介绍NCSTOJ:V : 蛋糕的最大幸运值,主要包括NCSTOJ:V : 蛋糕的最大幸运值使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

V : 蛋糕的最大幸运值
Time Limit:1 Sec Memory Limit:128 MiB
Back Submit Edit

Description
[洛谷 P1714]

今天是小Z的生日,同学们为他带来了一块蛋糕。

这块蛋糕是一个长方体,被用不同色彩分成了N个相同的小块,每小块都有对应的幸运值。

小Z希望吃到的蛋糕的幸运值总和最大,但小Z最多又只能吃M小块(M≤N)的蛋糕。

请你帮他从这N小块中找出连续的k块蛋糕(k≤M),使得其上的幸运值最大。

Input
第一行包含两个整数N和M,表示共有N小块蛋糕,小Z最多只能吃M小块。

第二行包含空格隔开的N个整数,第i个整数Pi代表第 i 小块蛋糕的幸运值。

数据范围:
1 ≤ N ≤ 500000

−500 ≤ Pi ≤ 500

Output
输出包含一个整数,为小Z能够得到的最大幸运值。
Sample Input
5 2
1 2 3 4 5
Sample Output
9
More Info
题意分析:

在长度为N的区间里找一个长度不超过M的区间,要求区间和最大。

输入样例2:
6 3

1 -2 3 -4 5 -6

输出样例2:

5

#include<iostream>
#include<deque>
using namespace std;
const int maxn=500010;
int f[maxn],sum[maxn];
int n,m,ms=-0x3f3f3f3f;
int maxnn=-0x3f3f3f3f;
int main(){
	//	freopen("qwe.txt","r",stdin);
	cin>>n>>m;
	deque<int >deq;
	for(int i=1;i<=n;i++)
	{
	scanf("%d",&f[i]);
    sum[i]=sum[i-1]+f[i];
maxnn=max(maxnn,f[i]);
}

for(int i=1;i<=n;i++)
{
	while(!deq.empty()&&sum[i]<sum[deq.back()]) deq.pop_back();
	//入队前维护单调性
	deq.push_back(i);
	while(!deq.empty()&&deq.back()-deq.front()>m) deq.pop_front();
	//入队后维护长度
	if(deq.size()>=2&&deq.size()<=m+1)ms=max(ms,sum[deq.back()]-sum[deq.front()]);
	//因为是根据前自序和计算的所以双端队列的长度最多可以比要求的最大长度还要多1(根据前自序和的性质)
	
	
	
}
if(ms==-0x3f3f3f3f)cout<<0<<endl;//注意特殊值判断
else cout<<ms<<endl;
return 0;






}