Hrbust 1522 利用队列求最大子序列的和

子序列的和
Time Limit: 1000 MS Memory Limit: 32768 K
     
Description
输入一个长度为n的整数序列(A1,A2,……,An),从中找出一段连续的长度不超过m的子序列,使得这个子序列的和最大。
Input
有多组测试数据,不超过20组测试数据
对于每组测试的第一行,包含两个整数n和m(n,m<=10^5),表示有n个数,子序列长度限制为m,表示这个序列的长度,第二行为n个数,每个数的范围为[-1000, 1000]。
 
Output
对于每组测试数据,输出最大的子序列和,并换行。
Sample Input
3 1
1 2 3
3 2
-1000 1000 1
Sample Output
3
1001
View Code
 1 #include <stdio.h>
 2 #include <iostream>
 3 using namespace std;
 4 const int N=100010;
 5 struct node
 6 {
 7     int v,add;
 8 }que[N],tmp;
 9 int main()
10 {
11     int p,a[N],n,m,begin,end;
12     while(scanf("%d%d",&n,&m)!=EOF)
13     {
14         a[0]=0;
15         for(int i=1;i<=n;i++)
16         {
17             scanf("%d",&p);
18             a[i]=a[i-1]+p;
19         }
20         begin=0;
21         end=-1;
22         int _min=-100000000;
23         for(int i=1;i<=n;i++)
24         {
25             while(begin<=end&&a[i-1]<que[end].v)
26             {
27                 end--;
28             }
29             while(begin<=end&&que[begin].add<i-m)
30             {
31                 begin++;
32             }
33             tmp.add=i-1;
34             tmp.v=a[i-1];
35             que[++end]=tmp;
36 
37             if(a[i]-que[begin].v>_min)
38              _min=a[i]-que[begin].v;
39         }
40         printf("%d\n",_min);
41     }
42 }

 

 
posted @ 2012-08-18 11:19  _sunshine  阅读(454)  评论(0编辑  收藏  举报