牛牛摆玩偶 二分

牛牛摆玩偶

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;
算法竞赛之路 文章被收录于专栏

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

全部评论

相关推荐

07-11 10:56
门头沟学院 Java
码客明:大胆的说自己能实习6个月就行
点赞 评论 收藏
分享
湫湫湫不会java:先投着吧,大概率找不到实习,没实习的时候再加个项目,然后把个人评价和荣誉奖项删了,赶紧成为八股战神吧,没实习没学历,秋招机会估计不多,把握机会。或者说秋招时间去冲实习,春招冲offer,但是压力会比较大
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-11 11:16
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

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