题目大意:
找出大于等于limit的最少的数字个数。
思路:
一共有N个数字,用一个sum数组把位于它前面的所有数字的和存进去(从1- N),然后判断sum[N]是否大于limit,如果不是的话就表示此题无解,就要输出0,否则就用二分查找,查找最短的长度。
代码:
#include <iostream>
using namespace std;
#include <stdio.h>
#include <cstring>
int N,S;
int num[100005];
int l,r,mid;
long long s[100005];
bool judge(int n) {
for(int i = 0; i <= N - n; i++) {
if(s[i + n] - s[i] >= S) // 只需要找到存在一个>=S的就表示此长度找得到
return true;
}
return false;
// printf("%d ",sum);
/* if(sum < S)
return false;
else {
s = sum;
// interv = r - l;
return true;
}*/
}
int main() {
// int interv;
while(scanf("%d %d",&N,&S) != EOF) {
memset(s,0,sizeof(s));
memset(num,0,sizeof(num));
for(int i = 1 ; i <= N; i++) {
scanf("%d",&num[i]);
s[i] = s[i - 1] + num[i];
}
if(s[N] < S) {
printf("0\n");
continue;
}
l = 0;
r = N;
while(l < r) {
mid = (l + r)/2;
if(judge(mid)) { //>=S
r = mid;
}
else { // <S
l = mid + 1 ;
}
}
printf("%d\n",l);
}
return 0;
}