牛牛摆玩偶 二分

牛牛摆玩偶

https://ac.nowcoder.com/acm/contest/9476/A

二分间距然后模拟即可

class Solution {
   public:
    typedef long long ll;
    static bool cmp(const Interval& a, const Interval& b) {
        return a.start < b.start;
    }
    bool chk(int n, int m, const vector<Interval>& a, int d) {
        int x = a[0].start, endx = a[m - 1].end;
        --n; //第一个点落在第一个区间的起始点上
        int p = 0;
        for (int i = x; n && i <= endx; --n) {
            if (a[p].end - i >= d)
                i += d;                                 //不需要跨区间
            else {                                      //需要跨区间
                while (p < m && a[p].end - i < d) ++p;  //找到可落子的区间
                int nowd = max(d, a[p].start - i);
                //考虑下个区间的第一个点距离当前点较远的情况
                i += nowd;
                if (m == p && n)
                    return 0;  //如果区间枚举完了,但点还没用完,该间距不行
            }
        }
        return n == 0;  //点恰好用完
    }
    int doll(int n, int m, vector<Interval>& a) {
        sort(a.begin(), a.end(), cmp);
        int d = a[m - 1].end - a[0].start;
        ll L = 1, R = d, ans = L;
        while (L <= R) {  //二分枚举答案
            ll mid = (L + R) / 2;
            if (chk(n, m, a, mid))
                ans = mid, L = mid + 1;
            else
                R = mid - 1;
        }
        return ans;
    }
} pp;
算法竞赛之路 文章被收录于专栏

整理、记录算法竞赛的好题

全部评论

相关推荐

我是没经验的毕业生,这啥情况啊会不会是hr在刷kpi
JamesGosli...:字节boss属于是群发了,我都快入职字节了,其他部门还在和我boss打招呼
点赞 评论 收藏
分享
05-22 09:23
门头沟学院 Java
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

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