本题题意是通过计算中间连续整数和是否定值相同得到一个范围,可以直接利用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);
}
}
}
使用upper_bound求连续子数组和
本文介绍了一种利用upper_bound函数寻找连续子数组和等于定值或最接近定值的方法。通过预处理数组的前缀和,再运用upper_bound进行查找,实现了对连续子数组和的有效计算。
798

被折叠的 条评论
为什么被折叠?



