给出一个序列和一个数s 求出满足和大于等于s的最短子序列.
做法如下:
首先求出ss[i] 表示前i个数的和, 因为ss[i]是递增的,所以可以进行二分答案.
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 100010;
int ss[maxn], sq[maxn], n, s;
int main(){
while(~scanf("%d%d", &n, &s)){
for(int i = 1; i <= n; ++i){
scanf("%d", &sq[i]);
ss[i] = ss[i - 1] + sq[i];
}
int L = 0, R = n, ans = maxn;
while(L < R){
int M = L + (R - L) / 2;
bool f = false;
for(int i = 1; i <= n - M + 1; ++i){
int sum = ss[i + M - 1] - ss[i - 1];
if(sum >= s){//找到一个和大于等于s的就退出循环
f = true;;
break;
}
}
if(f){
ans = M;
R = M;
}else{
L = M + 1;
}
}
if(ans == maxn){
printf("0\n");
}else{
printf("%d\n", ans);
}
}
return 0;
}