站外贪心题一道
  • 板块灌水区
  • 楼主Pumpkin_Duke
  • 当前回复8
  • 已保存回复8
  • 发布时间2020/8/22 14:51
  • 上次更新2023/11/6 19:40:15
查看原帖
站外贪心题一道
279658
Pumpkin_Duke楼主2020/8/22 14:51

老师在开学第一天就把所有作业都布置了,每个作业如果在规定的时间内交上来的话才有学分。每个作业的截止日期和学分可能是不同的。例如如果一个作业学分为10,要求在6天内交,那么要想拿到这10学分,就必须在第6天结束前交。

每个作业的完成时间都是只有一天。例如,假设有7次作业的学分和完成时间如下:

作业号 1 2 3 4 5 6 7

期限 1 1 3 3 2 2 6

学分 6 7 2 1 4 5 1

最多可以获得15学分,其中一个完成作业的次序为2,6,3,1,7,5,4,注意可能还有其他方法。

你的任务就是找到一个完成作业的顺序获得最大学分。

代码:

#include <bits/stdc++.h>

using namespace std;

int n , day , res;

bool y[1000010];

struct node {
	int a , b;
}x[1000010]; 

int cmp(node c , node d) {
	return c.b > d.b;
}

main() {
	ios::sync_with_stdio(false);
	//begin at here
	cin >> n;
	for(int i = 1; i <= n; i++) {
		cin >> x[i].a >> x[i].b;
	}
	sort(x + 1 , x + 1 + n , cmp);
	for(int i = 1; i <= n; i++) {
		for(int j = x[i].a; j >= 1; j--) {
			if(!y[j]) {
				y[j] = 1;
				res += x[i].b;
				break;
			}
		}
	}
	cout << res;
	return 0;
}

时间超限 60分

2020/8/22 14:51
加载中...