题目
pata1044
题目思路
本题是求数字串连续子串之和的题目,可设置两指针begin和end及之间串之和count,依照以下思路前进:若count<m(要求),即数字不够,则end++;若m<=count<=min(当前连续和超过m的最小值),则比要求大,那么min=count,begin++,若count>m,则begin++,依此得到大于等于m的最小连续子串和min,再扫描一次即可输出。
参考代码
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int m=0,n=0,min=(int)(pow(2,31)-1),k=0,begin=0,end=0,count=0;
int t=0;
cin>>n>>m;
int a[n];
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
count=a[0];
while(end<n)
{
if(count<m)
{
end++;
count+=a[end];
}
else if(count>=m&&count<=min)
{
if(count<min)
k=0;
k++;
min = count;
count-=a[begin];
begin++;
}
else if(count>min)
{
count-=a[begin];
begin++;
}
}
begin=end=0;
count=a[0];
while(end<n)
{
if(count<min)
{
end++;
count+=a[end];
}
else if(count==min)
{
printf("%d-%d",begin+1,end+1);
k--;
if(k>0)
printf("\n");
count-=a[begin];
begin++;
}
else if(count>min)
{
count-=a[begin];
begin++;
}
}
return 0;
}