牛客编程巅峰赛S2第四场:牛牛摆玩偶

题目描述:

原题链接
在这里插入图片描述

解题思路:

这道题写的时候,没有思路,感觉像是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;//说明所有玩偶已经放完了。
    }

猜你喜欢

转载自blog.csdn.net/qq_44900959/article/details/110284829