您的位置:首页 > 产品设计 > UI/UE

UvaLive LA2678 Subsequence

2014-02-16 10:54 411 查看
寻找一个序列中和不小于S的最短子序列,n的时间预处理出前缀和,然后枚举末位置二分初始位置nlogn搞定

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn = 100001;
int A[maxn],B[maxn];

int main() {
int n,S;
while(~scanf("%d%d",&n,&S)) {
int ans = 0;
for(int i = 1;i <= n;i++) {
scanf("%d",&A[i]);
B[i] = B[i - 1] + A[i];
int str = 1,end = i;
while(str < end) {
int mid = str + (end - str + 1) / 2;
if(B[i] - B[mid - 1] < S) {
end = mid - 1;
} else {
str = mid;
}
}
if(B[i] - B[str - 1] >= S) {
if(ans == 0) ans = i - str + 1;
else ans = min(ans,i - str + 1);
}
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: