题目描述:
解题思路:
这道题写的时候,没有思路,感觉像是dp但是不是。这道题其实是利用二分+贪心的思想,就是二分答案,如果一个距离符合条件,那么比这个距离小的就都符合条件,相反,如果不符合,那么比这个距离大的也就都不符合,所有二分的去找答案,然后check去判断是否符合,判断符合的时候就利用贪心的思想。
参考代码:
public class Interval {
int start;
int end;
public Interval(int start, int end) {
this.start = start;
this.end = end;
}
}
public int doll (int n, int m, Interval[] intervals) {
Arrays.sort(intervals,(a,b) -> a.start-b.start);
long l=0,r=(1<<31)-1;
int ans=0;
while (l<=r)
{
long mid=(l+r)/2;
if(check(intervals,mid,n)){
ans=(int)mid;
l=mid+1;
}
else {
r=mid-1;
}
}
return ans;
}
private boolean check(Interval[] intervals, long mid, int n) {
long now=intervals[0].start+mid;
int num=1;
for (int i = 0; i < intervals.length; i++) {
if(now>intervals[i].end){//如果比区间最后还大就继续寻找
continue;
}
now=Math.max(now,(long)intervals[i].start);//更新now的位置,可能不到区间,就取区间的开头,或者比区间大,取自身
long nums=(intervals[i].end-now)/mid+1;//区间可以放的个数
num+=nums;//更新放的玩偶个数
now+=mid*nums;//更新now的位置,原来的位置,加上放之的玩偶的个数*间隔
}
return num >= n;//说明所有玩偶已经放完了。
}