最佳工厂 HRBUST - 2171

最佳工厂 HRBUST - 2171

工厂收到了 n 个订单,每个订单为两个值(ai, bi),表示在bi 时刻之前需要生产出 ai 吨钢铁。
工厂的产量始终为每秒 1 吨,订单收的多了,就会来不及完成。于是工厂的老板决定拒绝最少数量的订单,使得能通过适当的顺序安排,将剩下的的订单全部满足。你能帮他计算最多满足多少订单吗?
Input
多组测试数据,对于每组测试数据:
输入第一行为一个整数n(n<=1000),接下来的 n 行每行两个整数ai, bi ,分别表示该任务需要的钢铁数量
和截至时间。(ai, bi <= 2*10^6)
Output
对于每组测试数据,输出一个整数表示最多可以满足的订单数量,每组输出占一行。
Sample Input
6
7 15
8 20
6 8
4 9
3 21
5 22
Sample Output
4

思路:最多能满足多少个订单,说明我们可以尽量完成个数少的订单。由于输入的时间是没有顺序的,所以在进行操作之前我们需要先对时间进行升序排序。
定义一个订单结构体node 有时间和个数
首先对时间进行升序排序,然后遍历,将每个订单入队(优先队列,优先出队个数比较多的),如果某一个时刻第 i 个的时间小于前 i 个订单的吨数,那么就从队列里面出队。由于每次出队都是出队订单中吨数最多的,因此吨数少的订单都留在队列中。

#include
#include
#include
using namespace std;
struct node {
	int time, num;
	bool friend operator<(node a, node b) {
		return a.num < b.num;
	}
}a[1005];
bool cmp(node a, node b) {//对时间升序排序
	return a.time < b.time;
}
int main() {
	int n;
	while (cin >> n) {
		int cnt = 0;//完成最多订单的数量
		int sum=0;
		for (int i = 0; i < n; i++) {
			cin >> a[i].num >> a[i].time;
		}
		sort(a, a + n, cmp);//排序
		priority_queue<node> q;
		for (int i = 0; i <n; i++) {
			q.push(a[i]);
			sum += a[i].num;
			cnt++;//入队
			while (a[i].time < sum) {//这个订单入队之后不满足条件
				sum -= (q.top()).num;
				cnt--;
				q.pop();
			}
		}
		cout << cnt << endl;
	}
	return 0;
}

你可能感兴趣的:(贪心,队列,算法,c++)