6. 贪婪的你
Description
现在大家正在为完成网络教室的题目而奋斗。你想获得更高的分数,但发现自己的效率有点儿低,于是请你写个程序计算一下:
假设一共有 n 个题目,每个题目 i 你都需要一个单位时间来完成。同时每个题目 i 都有一个完成期限 di 和相应的分数 pi 。这里的完成期限是指应在开始时间之后 di 个时间单位内(含di)完成,不能迟交。
所有题目同时开始计时,当且仅当题目 i 在它的期限截止以前被完成时,你才能获得 pi 的分数。完成期限的设定使得你不一定能将所有的题目全都按时完成。因此只有合理安排做题的顺序,才能在有限的时间内获得最高的分数。
问:在这种条件下,你能够得到的最高的分数是多少?
Input
第一行输入题目的总个数 n <= 10000;
第二行输入各个题目的分数 0 < pi <= 100;
第三行输入每一个题目的完成期限 0 < di <=10000;
Output
输出最高的分数。
测试用例 1 以文本方式显示
1.6↵
2.5 25 20 30 10 15↵
3.1 5 2 3 3 2↵
以文本方式显示
1.90↵
策略:贪心,在截止日期之前的每一天都取当天可以取得的最大值,相加即可。
#include<stdio.h>
#include<stdlib.h>
#define max(x,y) x>y?x:y
#define M 10005
struct course{
int e,sc;
}a[M];
int cmp(const void *a,const void *b)
{
struct course *x = (struct course *)a;
struct course *y = (struct course *)b;
if(x->e == y->e)
return x->sc > y->sc ;
return x->e < y->e;
}
int main()
{
int n,m=0,_max;
scanf("%d",&n);
for (int i = 0; i < n; i++)
scanf("%d",&a[i].sc);
for (int i = 0; i < n; i++) {
scanf("%d",&a[i].e);
m = max(m,a[i].e);
}
qsort(a,n,sizeof(a[0]),cmp);
int ans = 0,tmp;
for (int i = m; i > 0; i--)
{
_max = 0;
for (int j = 0; a[j].e >= i; j++)
{
if(a[j].sc > _max)
{
_max = a[j].sc;
tmp = j;
}
}if(_max){
ans += _max;
a[tmp].sc = 0;
}
}
printf("%d\n",ans);
return 0;
}