奥赛一本通 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;
}
posted @ 2026-09-03 08:53  萧西待水  阅读(4)  评论(0)    收藏  举报