题目描述
老师在开学第一天就把所有作业都布置了,每个作业如果在规定的时间内交上来的话才有学分。每个作业的截止日期和学分可能是不同的。例如如果一个作业学分为 10,要求在 6 天内交,那么要想拿到这 10 学分,就必须在第 6 天结束前交。
每个作业的完成时间都是只有一天。例如,假设有 7 次作业的学分和完成时间如下:
作业号 期限 学分
1 1 6
2 7
3 3 2
4 1
5 2 4
6 5
7 6 1
最多可以获得 15 学分,其中一个完成作业的次序为 2,6,3,1,7,5,4,注意可能还有其他方法。
你的任务就是找到一个完成作业的顺序获得最大学分。
输入格式
第一行一个整数 N,表示作业的数量;
接下来 N 行,每行包括两个整数,第一个整数表示作业的完成期限,第二个数表示该作业的学分。
输出格式
输出一个整数表示可以获得的最大学分。保证答案不超过 C/C++ 的 int 范围
分析
优先选学分最大,但数据太大,会TLE,但可以减少判定,具体见代码last
代码
#include <bits/stdc++.h>
using namespace std;
struct nb {
int t, w;
} q[10000000];
bool cmp(nb a, nb b) {
return a.w > b.w;
}
int vis[10000000];
int main() {
int m, n;
cin >> n;
for (int i = 0; i < n; i++)
scanf("%d %d", &q[i].t, &q[i].w);
sort(q, q + n, cmp);
int fa = 0;
int last=0;
for (int i = 0; i < n; i++) {
int bj = 1;
if (last>q[i].t) continue;
for (int j = q[i].t; j >= 1; j--)
if (vis[j] == 0) {
vis[j] = 1;
bj = 0;
fa += q[i].w;
break;
}
if (bj) last=q[i].t;
}
cout << fa;
return 0;
}