假期 题解

假期 题解

假期

题目

经过几个月辛勤的工作,FJ决定让奶牛放假。假期可以在1…N天内任意选择一段(需要连续),每一天都有一个享受指数W。但是奶牛的要求非常苛刻,假期不能短于P天,否则奶牛不能得到足够的休息;假期也不能超过Q天,否则奶牛会玩的腻烦。FJ想知道奶牛们能获得的最大享受指数。


输入

第一行:N,P,Q.
第二行:N个数字,中间用一个空格隔开,每个数都在longint范围内。


输出

一个整数,奶牛们能获得的最大享受指数。


样例

input
5 2 4
-9 -4 -3 8 -6

output
5


解题思路

前缀和
假如右端点是固定的
左端点越小最后的值越大
所以单调队列维护递增(维护左端点)


代码

#include
#include
#include
using namespace std;
long long n,x,y,h=1,t,ans=-2147483647,a[100020],q[100020],s[100020];  //记得开long long
int main()
{scanf("%lld%lld",&n,&x);for (int i=1;i<=n;i++){scanf("%lld",&a[i]);s[i]=s[i-1]+a[i];  //前缀和}for (int r=1;r<=n;r++){while (h<=t&&s[q[t]-1]>=s[r-1]) t--;  //找更小的左端点,包含的数少却更大,对后面的答案没有贡献q[++t]=r;  //保存进队列while (h<=t&&r-x>q[h]-1) h++;  //超出范围if (ans<s[r]-s[q[h]-1])  //更新答案ans=s[r]-s[q[h]-1]; }cout<<ans<<endl;return 0;
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部