poj3483 Loan Scheduling

题意:

一家银行收到了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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值