二分间距然后模拟即可
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; 
京公网安备 11010502036488号