B站笔试题 最短连续和大于等于s(二分)

题目描述:

B站笔试题 最短连续和大于等于s(二分)_第1张图片
B站笔试题 最短连续和大于等于s(二分)_第2张图片

大意:

最短连续和大于等于s。

思路:

由于每个价格都>0,所以就有一个单调性,二分长度即可,详细见代码:

参考代码:

//nuoyanli
#include
using namespace std ;

inline int read()
{
    register int x = 0 ;
    register int f = 1 ;
    register char c = getchar() ;
    for( ; ! isdigit(c) ; c = getchar())
        if(c == '-')
            f = -1 ;
    for( ; isdigit(c) ; c = getchar())
        x = (x << 1) + (x << 3) + (c & 15) ;
    return x * f ;
}

int n, s ;
vector < int > v ,sum ;
signed main()
{
    n = read(), s = read() ;
    v.push_back(0) ;
    for(register int i = 1 ; i <= n ; i ++)
        v.push_back(read()) ;
    sum.push_back(0) ;
    for(register int i = 1 ; i <= n ; i ++)
        sum.push_back(sum[i - 1] + v[i]) ;
    if(sum[n] < s)
        return !puts("-1") ;
    int len = n ;
    for(register int i = 1 ; i <= n ; i ++)
    {
        int l = i, r = n ;
        int ans = 1e8 ;
        while(l <= r)
        {
            int mid = l + r >> 1 ;
            if((sum[mid] - sum[i - 1]) < s)
            {
                l = mid + 1 ;
            }
            else
            {
                r = mid - 1 ;
                ans = mid ;
            }
        }
        len = min(ans - i + 1, len) ;
    }
    printf("%d", len) ;
    return 0 ;
}

你可能感兴趣的:(#,做题心得,#,二分)