08.14 大疆笔试 后端开发工程师(研发部)B卷 编程题

题目与 LC 1235. 规划兼职工作相同,但是需要输出最优任务的下标。
在原题的代码基础上加入路径记录就行了。DP+二分+记录路径:

class Solution {
    static class Job implements Comparable<Job> {
        int l, r, w;
        int idx;
        Job(int l, int r, int w, int idx) {
            this.l = l;
            this.r = r;
            this.w = w;
            this.idx = idx;
        }
        @Override
        public int compareTo(Job obj) {
            return Integer.compare(r, obj.r);
        }
    }
    public int jobScheduling(int[] sts, int[] eds, int[] w) {
            int n = sts.length;
            Job[] arr = new Job[n];
            for (int i=0; i<n; ++i) {
                arr[i] = new Job(sts[i], eds[i], w[i], i);
            }
            Arrays.sort(arr);

            int[] dp = new int[n+1];
            int[] states = new int[n+1];
            for (int i=1; i<=n; ++i) {
                dp[i] = dp[i-1];

                int l = -1, r = i-2;
                while (l < r) {
                    int mi = l + (r - l + 1) / 2;
                    if (arr[mi].r <= arr[i-1].l) l = mi;
                    else r = mi - 1;
                }
                // dp[i] = Math.max(dp[i], dp[l + 1] + arr[i-1].w);
                int t = dp[l + 1] + arr[i-1].w;
                if (t > dp[i]) {
                    // 选
                    dp[i] = t;
                    states[i] = l + 1;
                } else {
                    // 不选,用负数标记
                    states[i] = i - 1 - n;
                }
            }
            // 路径
            ArrayDeque<Integer> ret = new ArrayDeque<>();
            int i = n;
            while (i != 0) {
                int t = states[i];
                if (t < 0) {
                    // 不选
                    t += n;
                } else {
                    // 选
                    ret.offerFirst(arr[i-1].idx);
                }
                i = t;
            }

            System.out.println(ret);

            return dp[n];
    }
}


全部评论
hard~
点赞 回复 分享
发布于 2022-08-15 09:52

相关推荐

ArisRobert:统一解释一下,第4点的意思是,公司按需通知员工,没被通知到的员工是没法去上班的,所以只要没被通知到,就自动离职。就是一种比较抽象的裁员。
点赞 评论 收藏
分享
诨号无敌鸭:恭喜佬,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了
点赞 评论 收藏
分享
1 10 评论
分享
牛客网
牛客企业服务