hdu3415

news/2025/1/15 23:05:44/

求最大的连续不超过k的子序列的和。

用单调队列维护。

先求出s[1..i]的和,将前k个添加到n的结尾就相当于有循环和了。

那么对于某个sj,他的最大的序列和为s[j] - s[i],其中  j - k - 1 <= i <= j - 1.

那么用单调队列去维护i,可以在O(1)的时间去求出s[i]。

今后有任何优化问题需要减去前面最小或者加上最大和的都可以使用单调队列去维护。

AC代码:

#include <cstdio>
#include <cstring>const int MAX_NUMBER = 1000006;
const int INF = 2000000007;int sums[2 * MAX_NUMBER];
int value[MAX_NUMBER];
int queue[2 * MAX_NUMBER];int main() {int test_case;scanf("%d", &test_case);while (test_case--) {int n, length, head, tail, max_number, max_length, start, end;scanf("%d%d", &n, &length);sums[0] = 0;head = tail = 1;queue[head] = 0;max_number = -INF;start = end = MAX_NUMBER;max_length = MAX_NUMBER;for (int i = 1; i <= n; i++) {scanf("%d", &value[i]);sums[i] = sums[i - 1] + value[i];}for (int i = n + 1; i <= n + length - 1; i++) {sums[i] = sums[i - 1] + value[i % n];}for (int i = 1; i <= n + length - 1; i++) {while (tail >= head && i - queue[head] > length) {head++;}int temp = sums[i] - sums[queue[head]];if (temp >= max_number) {if (temp > max_number) {max_number = temp;max_length = i - queue[head];start = queue[head] + 1;end = i;}else {if (queue[head] + 1 < start) {max_length = i - queue[head];start = queue[head] + 1;end = i;}else if (queue[head] + 1 == start) {if (max_length > i - queue[head]) {max_length = i - queue[head];start = queue[head] + 1;end = i;}}}}while (tail >= head && sums[queue[tail]] > sums[i]) {tail--;}queue[++tail] = i;}if (end > n) {end -= n;}printf("%d %d %d\n", max_number, start, end);}return 0;
}



http://www.ppmy.cn/news/509236.html

相关文章

hdu 4339

2012多校题目&#xff0c;线段树求解 输入两个字符串&#xff0c;只要判断相同长度部分即可&#xff0c;多出来的部分可以忽略。转化&#xff1a;判断两个字符串相同位置字符是否相同&#xff0c;如果相同置为1&#xff0c;不同为0 那么问题就变成求 i到末尾的最长连续1的个数…

hdu 4435

hdu4435 思路&#xff1a;首先费用的特点&#xff0c;前i-1个城市都建的费用<第i个城市的费用&#xff0c;因此采用贪心策略&#xff0c;从n-1&#xff0c;可以不用建加油站的话就不要建&#xff1b;其次如何判断&#xff1f;因为是平面上的点&#xff0c;因此两点间的最短…

hdu 3749

此题解题报告在 http://mnlm.comyr.com/?p5

hdu3496

/* 分析&#xff1a; 二维背包的简单题。 2012-07-18 */ #include"stdio.h" #include"string.h"struct A {int price;int val; }E[111];int max(int a,int b) {return a>b?a:b; }int main() {int T;int n,m,L;int i,l,j;int dp[111][1011];scanf("…

hdu4349

/* 分析&#xff1a; 找规律 or lucas定理。 看这里看这里&#xff1a; http://blog.csdn.net/julyana_lin/article/details/7840491。。。 24K纯数学盲暴力打表找规律的。。 2013-07-17 */ #include"iostream" #include"cstdio" #include"cstring&q…

hdu4415

/* 分析&#xff1a; 贪心。 1、所有人都没有菜刀、无法砍别人。对于这种情况&#xff0c;直接根据cost排序&#xff0c; 来尽量多的杀人&#xff0c;得到第一组ans&#xff1b; 2、存在有菜刀的人&#xff1a; 如果猪角的武器的耐久、不足以使他杀死“有菜刀、且cost最小”的人…

hdu4193

/* 分析&#xff1a; 数据结构的分析类问题。 觉得是道挺有意思的水题&#xff0c;本来没想发&#xff0c;不过随便搜了下后发现清一色的单调队列。。 应该很快也要退役了&#xff0c;还是发下吧。。 这里说的移动&#xff0c;都是将最后一个元素放到首位。 1.如果sum<0&…

max3490esa_max3490中文资料

MAX3490CSA中文资料 元器件交易网www.cecb2b.com 19-0333; Rev 0; 12/94 MAX3483/MAX3485/MAX3486/MAX3488/MAX3490/MAX3491 3.3V-Powered, 10Mbps and Slew-Rate-Limited True RS-485/RS-422 Transceivers _______________General Description ____________________________Fe…