本题题意是通过计算中间连续整数和是否定值相同得到一个范围,可以直接利用upper_bound函数解决,因为数均为正整数,所以可以将将sum[i]定义为i及i以前的数之和,那么相减就能得到连续和的数啦
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=100010;
int main()
{
int sum[maxn]={0};
int n,m,temp,tempm;
cin>>n>>m;
tempm=100000010;
for (int i=1;i<=n;i++)
{
scanf("%d",&sum[i]);
sum[i]+=sum[i-1];
}
for (int i=1;i<=n;i++)
{
int j=upper_bound(sum+i,sum+n+1,m+sum[i-1])-sum;
if(sum[j-1]-sum[i-1]==m)
{
tempm=m;
break;
}
else if(sum[j]-sum[i-1]<tempm&&j<=n)
{
if(sum[j]-sum[i-1]>m)
tempm=sum[j]-sum[i-1];
}
}
for (int i=1;i<=n;i++)
{
int j=upper_bound(sum+i,sum+n+1,tempm+sum[i-1])-sum;
if(sum[j-1]-sum[i-1]==tempm)
{
printf("%d-%d\n",i,j-1);
}
}
}