周赛B

给出n个数,然后给一个数m,找出长度最短的连续子系列,其总和大于等于m。
n和m为正整数且n小于100 000,m小于100 000 000


若干组测试样例,处理到文件结束,注意无解情况输出0
第一行输入m,m。接下来一行有n个数。


input
10 15
5 1 3 5 10 7 4 9 2 8
5 11
1 2 3 4 5


output
2

3

#include<iostream>
#include<math.h>
#include<algorithm>
#include<string.h>
using namespace std;
int main(){
	long long n,m;
	long long a[100010];
	while(scanf("%lld %lld",&n,&m)!=EOF)
	{
		memset(a,0,sizeof(a));
		long long x,sum=0,vis=0;
		long long res=1e9+7;
		for(long long i=1;i<=n;i++){
			scanf("%lld",&x);
			sum+=x;
			a[i]=sum;
			if(sum>=m){
			for(long long j=i-1;j>=0;j--){
				if(a[i]-a[j]>=m){
					vis=1;
					long long t=i-j;
					if(res>t){
						res=t;
					}
					break;
				}
			}
		}
		}
		if(!vis){
			res=0;
		}
		printf("%lld\n",res);
	}
	return 0;
}

用a数组存储他们的和,在相减即可

写的时候很费劲,一直超时,后来改了改才过,知道看了学长的代码才知道可以这么简单

#include<iostream>  
#include<cstdio>  
#include<cstring>  
#include<cmath>  
using namespace std;  
const int MAXN=100000+10;    
int sum[MAXN];    
int main()    
{    
    int n,s,t;    
    while(scanf("%d%d",&n,&s)!=EOF)    
    {    
        sum[0]=0;    
        for(int i=1;i<=n;i++)    
        {    
            scanf("%d",&t);    
            sum[i]=sum[i-1]+t;    
        }    
        int ans=n+1,j=0;    
        for(int i=1;i<=n;i++)    
        {    
            if(sum[i]-s<0)continue;    
            while(sum[i]-sum[j]>=s) j++;    
            ans=min(ans,i-j+1);    
        }    
        printf("%d\n",ans==n+1 ? 0:ans);    
    }    
}  

其实跟我的整体思想都差不多但是这个

        for(int i=1;i<=n;i++)    
        {    
            if(sum[i]-s<0)continue;    
            while(sum[i]-sum[j]>=s) j++;    
            ans=min(ans,i-j+1);    
        }    
没想到,没想到


猜你喜欢

转载自blog.csdn.net/henu_jizhideqingwa/article/details/79953753