分类
枚举
大意:
给定n,s以及n个数,求最短的连续子序列的长度使得这个连续子序列的和大于等于s
时空限制:
3000ms
输入格式:
第1行,两个数n,s
第2行,n个数a[1],a[2]…a[n]
输出格式:
1个数,表示最短的连续子序列的长度,若是无法完成,输出0
数据范围:
10<n<105,s<108
先预处理前缀和
枚举开头i
之后二分查找能使由i开始的序列大于s的最短序列的尾指针
更新Min即可
#include<bits/stdc++.h>
using namespace std;
signed main(){
int n,s;
while(cin>>n>>s){
int a[n+1];
int Min=2147483647;
a[0]=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
a[i]+=a[i-1];
}
if(a[n]<s){
printf("0\n");
continue;
}
for(int i=1;i<=n;i++){
int l=i,r=n,mid;
while(l<r){
mid=(l+r)/2;
if(a[mid]-a[i-1]>=s) r=mid;
else l=mid+1;
}
if(a[l]-a[i-1]>=s) Min=min(Min,l-i+1);
}
printf("%d\n",Min);
}
return 0;
}