二分间距然后模拟即可
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;