华华给月月准备礼物 二分取最大长度

华华给月月准备礼物

http://www.nowcoder.com/questionTerminal/9963334321e64e61a397b262708e4f65

题意: 华华希望裁剪出至少根木棍,并且木棍的长度越长越好。
题解: 简单思考一下,发现二分最大长度即可,每次二分的时候表示判定以为当前木棍的最大长度是否可剪出至少根木棍,如果可以说明最大长度至少为,若不行则说明长度最长为的时间复杂度为,总时间复杂度为


代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

typedef long long ll;
const int N = 2e5 + 10;
int q[N], n, k;

ll check(int x) {
    ll res = 0;
    for(int i = 0; i < n; i++) res += q[i] / x;
    return res;
}

int b_s(int l, int r, ll k) {
    //l,r是木棍的长度 
    while(l < r) {
        int mid = l + r + 1 >> 1;
        if(check(mid) >= k) l = mid;
        else r = mid - 1;
    }
    return l;
}

int main()
{
    scanf("%d%d", &n, &k);

    int Ma = 0;
    for(int i = 0; i < n; i++) 
        scanf("%d", &q[i]), Ma = max(Ma, q[i]);

    int t = b_s(0, Ma, (ll)k);
    printf("%d\n", t);

    return 0;
} 

另:由于题目中说的初始木棍长度是非负整数,而数据范围给的,也许这就是二分的左边界不能为1的原因?(希望会的大佬可以教教我QwQ

全部评论

相关推荐

08-29 17:17
已编辑
门头沟学院
嗨害嗨我来了:张总:你们这些年轻人,这不是把我的爱好暴露了吗?
工作时那些社死瞬间
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务