题目大意
寻找连续子序列和等于给定目标数m 如果有多种情况就将多种情况从小到大输出
如果不存在子序列和刚好等于m 那么则寻找一个大于m的最小连续子序列和进行输出 如果有多种情况 也是按照从小到大进行输出
解题思路:
首先遍历序列 找到大于等于m的最小序列和min_t
再次遍历序列 使用双指针 将序列和刚好等于min_t的首尾编号按序输出;
贴一下ac代码:
#include<iostream>
using namespace std;
const int N=100010;
int a[N],n,m,min_t=1e8+10,cnt;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;++i)cin>>a[i];
for(int i=1,j=1;i<=n&&j<=n;++j)
{
cnt+=a[j];
if(cnt>=m)
{
if(cnt<min_t) min_t=cnt;
i++,j=i,cnt=0;
}
}
cnt=0;
for(int i=1,j=1;i<=n&&j<=n;++j)
{
cnt+=a[j];
if(cnt==min_t) cout<<i<<"-"<<j<<endl;
else if(cnt>min_t) i++,j=i-1,cnt=0;
}
return 0;
}