• 贪心-1697. 算法学习


    2020-03-24 23:06:02

    问题描述:

    现在,你有n个任务需要做。每个任务都有对应的奖励val,这意味着你只要完成了这个任务,就能获得对应的奖励。每个任务也有一个完成期限date,你只有在期限内(<=date[i])完成了这个任务,才能获得奖励。每个任务只能被完成一次,一天最多只能做一个任务。请你合理的分配任务,以获得最多的奖励。

    样例

    样例 1:

    输入:[50,60,70],[3,1,1]
    输出:120
    解释:
    对于第1个任务,你能在第1天,第2天,第3天中选择1天去完成。
    对于第2个任务,你只能选择第1天去完成。
    对于第3个任务,你只能选择第1天去完成。
    所以,我们选择第1天完成任务3,第2天完成任务1,50+70=120。任务2无法完成。

    样例 2:

    输入:[1,5,9],[1,1,1]
    输出:9
    解释:
    对于第1个任务,你只能选择第1天去完成。
    对于第2个任务,你只能选择第1天去完成。
    对于第3个任务,你只能选择第1天去完成。
    所以,我们选择第1天完成任务3。任务1和2无法完成。

    注意事项

    0 <= n <= 10000
    1 <= val[i] <= 10000
    1 <= date[i] <= 10000

    问题求解:

        int res = 0;
        public int algorithmLearning(int[] val, int[] date) {
            int n = val.length;
            List<int[]> record = new ArrayList<>();
            for (int i = 0; i < n; i++) record.add(new int[]{date[i], val[i]});
            Collections.sort(record, (int[] o1, int[] o2) -> Integer.compare(o1[0], o2[0]));
            PriorityQueue<Integer> pq = new PriorityQueue<>();
            for (int i = 0; i < n; i++) {
                if (record.get(i)[0] > pq.size()) {
                    res += record.get(i)[1];
                    pq.add(record.get(i)[1]);
                }
                else {
                    res += record.get(i)[1];
                    pq.add(record.get(i)[1]);
                    res -= pq.poll();
                }
            }
            return res;
        }
    

      

  • 相关阅读:
    模块之datetime
    模块之time模块
    模块之相对路径导入
    模块之包跨模块导入
    模块
    迭代器
    leetcode234 回文链表(Easy,不简单)
    leetcode543 二叉树的直径(Easy 不简单)
    leetcode538 把二叉树转换为累加树(Easy,不简单)
    leetcode136 只出现一次的数字(Easy)
  • 原文地址:https://www.cnblogs.com/hyserendipity/p/12562970.html
Copyright © 2020-2023  润新知