题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3415
单调队列的思想,我一直想用队列但是没用上,看了很多文章才写出来的。
AC代码:
#include<stdio.h>
int nums[100010], sum[200010], dx[200010];
main()
{
int m, n, k;
scanf("%d", &m);
while(m--)
{
int max = -99999999, s, e;
scanf("%d %d", &n, &k);
for(int i = 1; i <= n; i++)
{
scanf("%d", &nums[i]);
sum[i] = sum[i - 1] + nums[i];
}
for(int i = n + 1; i <= n + k; i++)
sum[i] = sum[i - 1] + nums[i - n];
int l = 0, r = 0;
for(int i = 1; i <= k + n; i++)
{
while(l < r && sum[dx[r - 1]] > sum[i - 1])//记录较小的sum,例如sum是 5 4 6 4 3 5 2 1 从第三个数6开始如果减去4会比减5的结果更大
r--;
dx[r++] = i - 1;
while(l < r && dx[l] < i - k)//长度大于最大长度时进到下一个位置
l++;
if(sum[i] - sum[dx[l]] > max)
{
max = sum[i] - sum[dx[l]];
s = dx[l] + 1;
e = i;
}
}
if(s > n)
s -= n;
if(e > n)
e -= n;
printf("%d %d %d\n", max, s, e);
}
}