牛客编程巅峰赛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;//说明所有玩偶已经放完了。
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值