POJ 3061 (二分找值)

来源:互联网 发布:动态桌面主题下载软件 编辑:程序博客网 时间:2024/05/20 18:18

一个由N个正整数组成的序列  // 10 < N < 10^5

其中每个数小于或等于10000

给定一个正整数 S // S < 10^9

找到一个长度最小的连续子序列,使各个元素之和不小于S

输出此子序列长度


#include <stdio.h>#include <algorithm>#include <iostream>using namespace std;int integer[100010];int num_integer;int sum;bool check(int length){    int temp_sum = 0;    for (int i = 0; i < length; ++i)        temp_sum += integer[i];    if(temp_sum>=sum)        return true;    for (int tail = length,head = 0; tail < num_integer; ++tail, ++head)    {        temp_sum -= integer[head];        temp_sum += integer[tail];        if(temp_sum>=sum)            return true;    }    return false;}int solve(){    int l = 0;    int r = num_integer;    while(r - l > 1) // find in (l, num_integer]    {        int mid = r - (r-l)/2;        if(check(mid))            r = mid;        else            l = mid;    }    return r;}int main(){    int num_case;    cin>>num_case;    while(num_case--)    {        scanf("%d %d", &num_integer, &sum);        int temp_sum = 0;        for (int i = 0; i < num_integer; ++i)        {            scanf("%d", &integer[i]);            temp_sum += integer[i];        }        if(temp_sum<sum)            printf("0\n");        else            printf("%d\n", solve());    }}



0 0
原创粉丝点击