找到区间和等于w,如果不存在,就让区间和大于w取最小。
前缀和+双指针
#include <iostream>
using namespace std;
const int N = 100010;
int a[N],b[N];
//前缀和+双指针
int main()
{
int n,w;
cin >> n >> w;
for(int i = 1; i <= n; i ++) cin >> a[i];
for(int i = 1; i <= n; i ++) b[i] = b[i - 1] + a[i];
int mmax = 1e9,f = 0;
for(int i = 1,j = 1; i <= n; i ++)
{
while(j <= n && b[j] - b[i - 1] < w) j ++;
if(b[j] - b[i - 1] == w)
{
printf("%d-%d\n",i,j);f = 1;
}
if(b[j] - b[i - 1] > w) mmax = min(mmax,b[j] - b[i - 1]);
}
if(!f)
{
w = mmax;
for(int i = 1,j = 1; i <= n; i ++)
{
while(j <= n && b[j] - b[i - 1] < w) j ++;
if(b[j] - b[i - 1] == w) printf("%d-%d\n",i,j);
}
}
return 0;
}