求连续子序列和为m或最接近m。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <map>
#include <stack>
#include <queue>
#include <algorithm>
#include <set>
using namespace std;
const int maxn=1e5+10;
struct chain{
int s;
int e;
};
chain c;
vector<chain> ch;
int n,m,sum,close,num[maxn];
int main(){
//freopen("E://PAT/input.txt", "r", stdin);
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
if(close<m)
close+=num[i];
}
for(int i=1,j=1;j<=1+n;){
if(sum<m)
sum+=num[j++];
else{
if(sum==close){
c.s=i,c.e=j-1;
ch.push_back(c);
}
if(sum<close){
close=sum;
ch.clear();
c.s=i,c.e=j-1;
ch.push_back(c);
}
sum-=num[i];
i++;
}
}
for(int i=0;i<ch.size();i++)
printf("%d-%d\n",ch[i].s,ch[i].e);
return 0;
}