贪心-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;
    }

  

原文地址:https://www.cnblogs.com/hyserendipity/p/12562970.html