这个题表面好像是用部分和求任意区间val[ i~j ]内的数字和,但那样是O(n*n),用顺序扫描的方法是O(n)复杂度,还是很经典的问题
#include<vector>
#include<iostream>
using namespace std;
int val[100003],pay,n,mmin=1<<30, sum=0;
vector<pair<int,int>>posp;
int main(){
scanf("%d%d",&n,&pay);
for(int i=1;i<=n;i++) scanf("%d",val+i);
for(int i=1,j=1;i<=n;++i){
while(j<=n&& sum<pay)sum+=val[j++];
if(sum<pay)break;
if(sum<mmin){posp.clear();mmin=sum;}
if(sum==mmin)posp.emplace_back(i,j-1);
sum-=val[i];
}
for(auto&x:posp)printf("%d-%d\n",x.first,x.second);
}