[POJ] 3061 — Subsequence
原题链接:https://vjudge.net/problem/21444/origin
题目大意:
给定N个数字,计算出最短的连续子序列,使这个子序列的全部数字之和大于或等于给定数字S。如果不存在可以满足题意的子序列则输出0。
题目分析:
这是经典的,相对比较容易的尺取问题,通过遍历每一个连续子序列即可得出答案。但是,由于时间的限制,要注意一些已经没有意义的连续子序列和被重复计算的过程。
代码实现:
#include <iostream>
#include <cstdio>
int a[100005];
int main()
{
int t;
int n,s;
int sum,mini;
int i,j;
scanf("%d",&t);
//多组样例
while(t--){
scanf("%d%d",&n,&s);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
if(s==0)printf("%d\n",1);
else{
//初始化
mini=n+1;
sum=0;
j=0;
for(i=0;i<n;i++){
//保留上一次循环的sum的结果,减少重复计算,避免超时
if(i>0){
sum-=a[i-1]+a[j];
}
for(;j<n;j++){
sum+=a[j];
if(sum>=s){
if(mini>j-i+1)
mini=j-i+1;
break;
}
}
/*当一个子序列加到数组最后,也就是最后一个数字,依旧
小于S,则不必计算后面的子序列*/
if(j==n)break;
}
if(mini==n+1)mini=0;
printf("%d\n",mini);
}
}
return 0;
}
最后,希望路过的dl们能给予改进的建议!