2680. Sequence
Constraints
Time Limit: 1 secs, Memory Limit: 256 MB
Description
Given a sequence S of n numbers and two length bounds L and U.
Your task is to write a program to find a segment S[i], S[i+1], …, S[j] with minimum sum over all segments of S with length at least L and at most U.
Input
The input consists of multiple datasets. The end of the input is indicated by a line containing a zero.
The format of each dataset is as follows.
n
L U
S1 S2 … Sn
Here, all data items are positive integers. n is the length of the sequence (N<=32767). L and U are two length bounds where L<=U. S1, S2, …, Sn are the sequence of n numbers.
Output
For each dataset, output the minimum sum of segment, in a separate line.
Sample Input
9 2 8 -3 2 -2 5 -4 1 -2 3 1 0
Sample Output
-5
Hint
the segment is -4 1 -2.
Problem Source
系列热身赛5@2011年上半学期算法考试和4+2选拔赛
// Problem#: 2680
// Submission#: 3592135
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include <stdio.h>
#include <string.h>
const int MAXN = 40009;
int N, L, U;
int * p, cnt, mem[MAXN];
int sum[MAXN];
void input() {
int i, x;
scanf("%d%d", &L, &U);
sum[0] = 0;
for (int i = 1; i <= N; i++) {
scanf("%d", &x);
sum[i] = sum[i - 1] + x;
}
}
void solve() {
int i, j, ans;
cnt = 0;
ans = sum[L] - sum[0];
p = mem;
p[cnt++] = 1;
for (i = L + 1; i <= N; i++) {
while (cnt && i - p[0] + 1 > U) {
--cnt;
++p;
}
for (j = cnt - 1; j >= 0; j--)
if (sum[i - L] < sum[p[j] - 1]) break;
p[j + 1] = i - L + 1;
cnt = j + 2;
if (ans > sum[i] - sum[p[0] - 1]) ans = sum[i] - sum[p[0] - 1];
}
printf("%d\n", ans);
}
int main() {
while (scanf("%d", &N) && N) {
input();
solve();
}
return 0;
}