P1714
题目
题目描述:
今天是小 Z 的生日,同学们为他带来了一块蛋糕。这块蛋糕是一个长方体,被用不同色彩分成了 n 个相同的小块,每小块都有对应的幸运值。
小 Z 作为寿星,自然希望吃到的蛋糕的幸运值总和最大,但小 Z 最多又只能吃 m(m≤n) 小块的蛋糕。
请你帮他从这 n 小块中找出连续的 k(1≤k≤m) 块蛋糕,使得其上的总幸运值最大。
形式化地,在数列 {pn} 中,找出一个子段 [l,r](r−l+1≤m),最大化 i=l∑rpi。
输入格式:
第一行两个整数 n,m。分别代表共有 n 小块蛋糕,小 Z 最多只能吃 m 小块。
第二行 n 个整数,第 i 个整数 pi 代表第 i 小块蛋糕的幸运值。
输出格式:
仅一行一个整数,即小 Z 能够得到的最大幸运值。
数据范围与说明:
数据规模与约定
- 对于 20% 的数据,有 1≤n≤100。
- 对于 100% 的数据,有 1≤n≤5×105,∣pi∣≤500。
保证答案的绝对值在 [0,231−1] 之内。
输入输出样例 #1
输入:
输出:
输入输出样例 #2
输入:
输出:
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #include <bits/stdc++.h> using namespace std; int ans=-233333333,n,m,a,sum[500006]; deque<int>q; int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ cin>>a; sum[i]=sum[i-1]+a; } q.push_back(0); for(int i=1;i<=n;i++){ while(q.front()+m<i){ q.pop_front(); } ans=max(ans,sum[i]-sum[q.front()]); while(!q.empty()&&sum[q.back()]>=sum[i]) { q.pop_back(); } q.push_back(i); } cout<<ans; }
|