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