26. 贪婪的你

现在大家都在为完成网络教室的题目而奋斗。假设一共有 n 道题目,每道题目 i 都需要一个单位时间来完成。同时每道题目 i 有完成期限 di 和相应的分数 pi 。此处的完成期限指应在开始时间之后 di 个时间单位内(含di)完成,不允许迟交。

假设所有题目同时开始计时,当且仅当题目 i 在它的期限截止以前被完成,你才能获得 pi 的分数。完成期限的设定使得你不一定能将所有题目全都按时完成。因此只有合理安排做题的顺序,才能在有限的时间内获得最高的分数。那么在这种条件下,你能够得到的最高分数是多少呢?

输入

输入包含三行,第一行输入题目的总个数 1 ≤ n ≤ 10000,第二行输入各个题目的分数 0 < pi ≤ 100,第三行输入每一个题目的完成期限 0 < di ≤ 10000,所有输入均为整数。

输出

你能获得的最高分数。

测试输入关于“测试输入”的帮助期待的输出关于“期待的输出”的帮助时间限制关于“时间限制”的帮助内存限制关于“内存限制”的帮助额外进程关于“{$a} 个额外进程”的帮助
测试用例 1以文本方式显示
  1. 6↵
  2. 5 25 20 30 10 15↵
  3. 1 5 2 3 3 2↵
以文本方式显示
  1. 90↵
1秒1024KB0


//贪心
//先排个序,如何从最后一天往前推,每一天都完成一个从截至日期到目前分数最大的题,并累和即可
#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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值