最佳工厂 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

这是一道贪心算法题,为了满足题意,拒绝最少数量的订单,我们就拒绝当前被选入订单中要求产量最多的订单,被删除的订单我们将这个订单吨数设置为-1,以免影响后续排序。
每次判断当然时间是否小于订单的截止时间,如果大于我们就开始删除被选中订单中要求产量最大的订单。
很典型的贪心算法。

代码如下:

#include
#include 
#include
#include
using namespace std;
struct muban
{
 	int a;//a吨钢铁 
 	int b;//b时刻之前 
}que[1005];
bool cmp(muban x,muban y)
{
 	return x.b<y.b;
}
int main()
{
 	int n;
 	while(cin>>n)
 	{
  		for(int i=0;i<n;i++)
  		cin>>que[i].a>>que[i].b;
  		sort(que,que+n,cmp);
  		int now=0;
  		int count=0;
  		for(int i=0;i<n;i++)
  		{
   			now+=que[i].a;
   			count++; 
   			if(now>que[i].b)//如果时间超过截止时间 
   			{
    				while(1)//开始删除订单,删到合适再跳出循环 
    				{
     					int max=i;//设置最大订单下标max 
     					for(int j=i-1;j>=0;j--)
     					{
      						if(que[j].a>que[max].a)
      						{ 
       							max=j;
      						}
     					}
     					now-=que[max].a;//删除最大订单产量
     					que[max].a=-1; //将最大订单产量设置为-1 
     					count--;
     					if(now<=que[i].b) 
     					{
      						break;//符合要求跳出循环,否则再删除一个订单。 
     					}
    				}
   			}
  		}
  		cout<<count<<endl;
 	}
 	return 0;
} 

你可能感兴趣的:(最佳工厂 HRBUST--2171 贪心算法+快排)