题意:
一家银行收到了N(<=10000)个贷款申请,每个贷款都最晚要在di(<=10000)时完成,利润为pi。每个贷款需要一个单位时间处理,银行在同一时间内最多可以接受L(<=100)个贷款。求如何安排才能获得最大利润。
输入:
多组样例
每组样例的第一行为两个数,n和L
n为接下来要输入的贷款数,L表示银行单个时间能处理的最多贷款数
接下来每两个数代表该个贷款的收益p和最后期限d,可在d时间完成
算法:
每次取收益最大的,将他放在最后期限的时间,若该时间已满,则往前移,直到没有空闲,则舍弃该贷款
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
class T
{
public:
int p;//价值
int d;//deadline
}loan[10010];
int counter[10010];//counter[i]表示当前i天的已处理的贷款的数量
bool cmp(T a,T b)
{
return a.p>b.p;
}
int main()
{
int n,L;//L表示某一时间所能处理的最多贷款数
while(~scanf("%d%d",&n,&L))
{
for(int i=0;i<n;i++)
{
scanf("%d%d",&loan[i].p,&loan[i].d);
}
memset(counter,0,sizeof(counter));
sort(loan,loan+n,cmp);//按照价值的从大到小排序
int ant=0;
for(int i=0;i<n;i++)
{
while(counter[loan[i].d]==L)
{
loan[i].d--;
}
if(loan[i].d<0)
{
continue;
}
counter[loan[i].d]++;
ant+=loan[i].p;
}
printf("%d\n",ant);
}
return 0;
}