ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-04-19 14:54:01  阅读:276  来源: 互联网

标签:int deq NCSTOJ maxn 蛋糕 幸运值 小块


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;






}

标签:int,deq,NCSTOJ,maxn,蛋糕,幸运值,小块
来源: https://blog.csdn.net/qq_42635159/article/details/89399453

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有