双指针专题4:区间最大和

描述

给定n个正整数组成的数列a 
1

 ,a 
2

 ,⋅⋅⋅,a 
n

 和一个整数m。
求出这个数列中的一个子区间[i,j],也就是在这个数列中连续的数字使得这个子区间的和在不超过m的情况下最大。

如果有多个区间符合要求,请输出最靠前的那一个区间。

输入描述

输入共两行。
第一行,两个整数n,m;
第二行,n个整数a 
输出描述

一行,三个整数,表示符合题意的区间的左端点、右端点和累加和。

解释一个样例:

mx=-1,l1=-1,r1=-1;

5 10

2 3 4  5    6

2 5 9 14 20(前缀和)

(2<10:mx=2,l1=1,r1=1,r++)

2 5 9 14 20

(5<10:mx=5,l1=1,r1=2,r++)

2 5 9 14 20

(9<10:mx=9,l1=1,r1=3,r++)

2 5 9 14 20

(14>10:l++)

2 5 9 14 20

(14-5=9<10:mx=9,但没有>mx,所以l1和r1不更新,r++)

2 5 9 14 20

(20-5=15>10:l++)

2 5 9 14 20

(20-9=11>10:l++)

2 5 9 14 20

(20-14=6<10:r++,但r>n,所以循环结束)

输出:1 3 9

滑动窗口。

#include
using namespace std;
int a[4000010];
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
    	scanf("%d",&a[i]);
        a[i]=a[i]+a[i-1];//求前缀和
	}
	int l=1,r=2,l1=-1,r1=-1;
	int mx=-1;
	while(lmx){
				mx=cnt;
			 	l1=l;
			 	r1=r;
			}
			r++;//试探极值
		}
		else l++;
	}
	cout<

你可能感兴趣的:(算法,c++,双指针)