奥赛一本通 1430 家庭作业
1430 家庭作业
题目大意
有 $n $ 个作业,每个作业都有一个最晚的完成时间,按时完成可获得学分,求可以获得的最大学分。(同 1426 智力大冲浪,补充数据范围 $n \le 10^6$。)
知识要点
贪心、排序、堆
解题思路
从时间的角度考虑,越靠后的时间可完成的作业越少,因此选择学分多的作业完成。将所有作业根据要求时间从后到前排序,随着时间往前回退,可以完成的作业越来越多,使用堆取出学分最多的作业即可,时间复杂度 $O(n \log n)$。
参考代码
#include <bits/stdc++.h>
using namespace std;
struct Task {
int t, w;
} T[1000005];
bool cmp(Task A, Task B) {
return A.t > B.t;
}
int main() {
int n, m = 0;
scanf("%d", &n);
for(int i = 0; i < n; i++) scanf("%d%d", &T[i].t, &T[i].w);
sort(T, T + n, cmp);
priority_queue<int> Q;
for(int i = 0, j = n; j ; j--) {
while(i < n && T[i].t == j) Q.push(T[i++].w); //加入当前时间可完成的作业
if(Q.size()) m += Q.top(), Q.pop(); //取出学分最高的作业完成
}
printf("%d\n", m);
return 0;
}

浙公网安备 33010602011771号