给出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
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); }没想到,没想到