给出多种水果,给出他的价值和截止日期,问最大获利。
用一个b的数组记录,将每种水果根据价值从大到小排序,从截止日期开始以此向前找,将利润放在b数组保存,然后将b数组的值累加就可以了。
#include <stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
int px,pd;
};
bool cmp(node a,node b)
{
return a.px>b.px;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==0) {printf("0\n");continue;}
struct node a[10001];
int i;
for(i=0;i<n;i++)
{
scanf("%d%d",&a[i].px,&a[i].pd);
}
int sum=0;
int b[10001]={0};
sort(a,a+n,cmp);
for(i=0;i<n;i++)
{
int t=a[i].pd;
while(t--)
{
if(b[t]<a[i].px) {b[t]=a[i].px;break;}
}
}
for(i=0;i<10001;i++)
{
sum+=b[i];
}
printf("%d\n",sum);
}
return 0;
}
/*
4 50 2 10 1 20 2 30 1
7 20 1 2 1 10 3 100 2 8 2
5 20 50 10
*/