题目链接
工厂收到了 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 22Sample Output
4
这是一道贪心算法题,为了满足题意,拒绝最少数量的订单,我们就拒绝当前被选入订单中要求产量最多的订单,被删除的订单我们将这个订单吨数设置为-1,以免影响后续排序。
每次判断当然时间是否小于订单的截止时间,如果大于我们就开始删除被选中订单中要求产量最大的订单。
很典型的贪心算法。
代码如下:
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
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;
}