题意:有n个任务,给出了每个任务的奖金和期限,每个任务完成都要1个时间单位,问选择一些任务都按时完成可以得到的最多奖金是多少。
题解:先按时间排序,倒着枚举所有时间点,给它分配奖金最大的且未被分配的任务。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 10005;
struct P {
int pi, d, flag;
}p[N];
int n, res;
bool cmp(P a, P b) {
if (a.d != b.d)
return a.d < b.d;
return a.pi > b.pi;
}
void solve(int dt) {
for (int i = dt; i >= 1; i--) {
int maxx = -1, index;
for (int j = n - 1; j >= 0, p[j].d >= i; j--) {
if (!p[j].flag && maxx < p[j].pi) {
maxx = p[j].pi;
index = j;
}
}
if (maxx != -1) {
p[index].flag = 1;
res += maxx;
}
}
}
int main() {
while (scanf("%d", &n) == 1) {
for (int i = 0; i < n; i++)
p[i].flag = 0;
for (int i = 0; i < n; i++)
scanf("%d%d", &p[i].pi, &p[i].d);
sort(p, p + n, cmp);
int dt = p[n - 1].d;
res = 0;
solve(dt);
printf("%d\n", res);
}
}