牛牛摆玩偶

从左至右对区间进行排序,因为D满足单调性,即如果D可以,D-1一定可以。所以可以在分隔距离D上进行二分答案。
对于固定的D,我们要检查是否可以放置至少N个玩偶。这可以通过贪心的策略来完成。只需将每个玩偶放在最左边的位置即可。一旦奶牛数量达到N,就可以break了,因此可以在O(N + M)时间检查一个D。
所以复杂度为O((N + M)log(max dist))。

/**
 * struct Interval {
 *    int start;
 *    int end;
 * };
 */
#define LL long long
#define INF 2000000000
#define X start
#define Y end

int nn, mm;
vector<Interval> a;

bool ok(int d) 
{
    LL prev = -1LL * INF * INF;

    int cnt = 0;
    for(int kk = 0; kk < a.size(); kk ++)
    {
        Interval i = a[kk];
        while (max(prev + d, (LL)i.X) <= i.Y) 
        {
            prev = max(prev + d, (LL)i.X);
            cnt++;
            if (cnt >= nn) break;
        }
        if (cnt >= nn) break;
    }

    return (cnt >= nn);
}
bool cmp(Interval x, Interval y)
{
    if(x.X == y.X) return x.Y < y.Y;
    return x.X < y.X;
}


class Solution {
public:
    /**
     * 
     * @param n int整型 玩偶数
     * @param m int整型 区间数
     * @param intervals Interval类vector 表示区间
     * @return int整型
     */
    int doll(int n, int m, vector<Interval>& intervals) {
        // write code here
        sort(intervals.begin(), intervals.end(), cmp);
        a.resize(m);
        nn = n;
         for(int kk = 0; kk < intervals.size(); kk ++) a[kk] = intervals[kk];
        int lo = 1;
        int hi = INF;
        int res = -1;

        while (lo <= hi) 
        {
            int mid = (lo + hi) / 2;
            if (ok(mid)) 
            {
                res = mid;
                lo = mid + 1;
            }
            else 
            {
                hi = mid - 1;
            }
        }
        return res;
    }
};
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-02 17:28
25届每天都在焦虑找工作的事情0offer情绪一直很低落硬撑着面了一个岗位岗位有应酬的成分面试的时候hr给我出各种场景题问的问题比较犀利&nbsp;有点压力面的感觉感觉有点回答不上来本来就压抑的情绪瞬间爆发了呢一瞬间特别想哭觉得自己特别没用没绷住掉眼泪了事后想想觉得自己挺有病的&nbsp;真的破大防了
喜欢唱跳rap小刺猬...:我觉得没关系吧,之前有一次面试leader给我压力面,我顶住了压力,结果入职的时候发现组里氛围很差,果断跑路。其实从面试就能大概看出组的情况,面试体验好的组倒是不一定好,但是面试体验不好的组。。。就很难说
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-02 14:45
bg是二本双一流硕,目标是Java后端开发岗,投暑期实习0大厂面试,只有极少的大厂测开,可能投的晚加上简历太烂加上0实习?求大佬们给个建议
程序员小白条:别去小厂,初创或者外包,尽量去中小,100-499和500-999,专门做互联网产品的,有公司自研的平台和封装的工具等等,去学习一些业务相关的,比如抽奖,积分兑换,SSO认证,风控,零售等等,目标 Java 后端开发吗?你要不考虑直接走大厂测开?如果技术不行的话,有面试你也很难过的
实习,不懂就问
点赞 评论 收藏
分享
后来123321:别着急,我学院本大二,投了1100份,两个面试,其中一个还是我去线下招聘会投的简历,有时候这东西也得看运气
无实习如何秋招上岸
点赞 评论 收藏
分享
06-02 15:17
门头沟学院 Java
心爱的idea:怎么会呢 应该是打招呼有问题 问就说实习6个月全国可飞随时到岗
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
今天 14:00
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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