现在大家都在为完成网络教室的题目而奋斗。假设一共有 n 道题目,每道题目 i 都需要一个单位时间来完成。同时每道题目 i 有完成期限 di 和相应的分数 pi 。此处的完成期限指应在开始时间之后 di 个时间单位内(含di)完成,不允许迟交。
假设所有题目同时开始计时,当且仅当题目 i 在它的期限截止以前被完成,你才能获得 pi 的分数。完成期限的设定使得你不一定能将所有题目全都按时完成。因此只有合理安排做题的顺序,才能在有限的时间内获得最高的分数。那么在这种条件下,你能够得到的最高分数是多少呢?
输入
输入包含三行,第一行输入题目的总个数 1 ≤ n ≤ 10000,第二行输入各个题目的分数 0 < pi ≤ 100,第三行输入每一个题目的完成期限 0 < di ≤ 10000,所有输入均为整数。
输出
你能获得的最高分数。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 1024KB | 0 |
//贪心
//先排个序,如何从最后一天往前推,每一天都完成一个从截至日期到目前分数最大的题,并累和即可
#include<stdio.h>
#include<stdlib.h>
typedef struct TIPS
{
int Val;
int DeadLine;
}tips;
tips num[10005];
int cmp(const void *a, const void *b)//排序规则为从小到大排序
{
if ((*(tips *)a).DeadLine == (*(tips *)b).DeadLine)
return (*(tips *)a).Val > (*(tips *)b).Val ? 1 : -1;
else
return (*(tips *)a).DeadLine > (*(tips *)b).DeadLine ? 1 : -1;
}
int main()
{
int n, DDL = 0, Max_Sum = 0;
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &num[i].Val);
for (int i = 0; i < n; i++)
{
scanf("%d", &num[i].DeadLine);
if (DDL < num[i].DeadLine)
DDL = num[i].DeadLine;
}
qsort(num, n, sizeof(num[0]), cmp);
for (int Day = DDL; Day > 0; Day--)//每个天数Day都肯定要写一道题
{
int Max_Val = 0, Max_day;
for (int _Day = n-1; num[_Day].DeadLine >= Day; _Day--)//从DeadLine到当前Day,选出最大分数的题
{
if (num[_Day].Val > Max_Val)
{
Max_Val = num[_Day].Val;
Max_day = _Day;
}
}
if (Max_Val)//如果有最大,则累和,否则略过
{
Max_Sum += Max_Val;
num[Max_day].Val = 0;
}
}
printf("%d\n", Max_Sum);
return 0;
}