首页 > 代码库 > poj 3061
poj 3061
先是看了一下讲解 ,选取 了二分法 ,由于数列都是正数的特殊情况,每一个sum【i】+s 对应一个最小的连续序列,最后只要减掉sum【i】就可以,lower_bound刚好可以用来查找最小的sum【i】+i,算法复杂度(nlogn),另外还有一种尺取法,复杂度只有n,大意是设置t,s两个节点,不断加减来更新res的最小值
下面是ac过的法一代码******************************************
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include <algorithm>
using namespace std;
const int maxn=100010;
int a[maxn];
int sum[maxn];
int times;
int n,s;
int res;
////////////////////
void solve(){
for(int j=0;j<n;j++){
sum[j+1]=sum[j]+a[j];
//cout<<sum[j]<<endl;
}
if(sum[n]<s){
// cout<<‘0‘<<endl;
printf("0\n");
return ;//不要忘了跳出
}
res=n;
for(int i=1;sum[i]+s<sum[n];i++){
int t=lower_bound(sum+i,sum+n,sum[i]+s)-sum;
res=min(res,t-i);
}
cout<<res<<endl;
}
int main(){
cin>>times;
while(times--){
cin>>n>>s;
memset(a,0,sizeof(a));
memset(sum,0,sizeof(sum));
for(int i=0;i<n;i++){
cin>>a[i];
}
solve();
}
return 0;
}
poj 3061