题目描述
有n个作业,每个作业有自己的ddl,每天可以完成一个作业,ddl之前未完成作业则扣除相应分数,求解使得扣分最少。
Input
输入包含T个测试用例。输入的第一行是单个整数T,为测试用例的数量。
每个测试用例以一个正整数N开头(1<=N<=1000),表示作业的数量。
然后两行。第一行包含N个整数,表示DDL,下一行包含N个整数,表示扣的分。
Output
对于每个测试用例,输出最小的总降低分数,每个测试用例一行。
解题思路
贪心,以分数为贪心指标,由于每天只能完成一项作业,因此得到贪心策略如下:
- 从最后一天开始,找当天ddl的分数最高的作业完成;
- 往前推一天,找到之前剩余的作业和ddl为当天的作业中,分数最高的作业完成;
- 以此类推,直至到达第一天,则每一天都完成了一项作业,且可以保证完成作业的分数最高。
基于这种策略,使用最大堆来存储每个作业,同时需要定义作业的结构体,并且标记好每一天的日期,以便和作业的ddl比对,利用最大堆的特性来计算作业分数。
实现代码
#include<iostream>
#include<queue>
using namespace std;
struct DDL
{
int ddl,score;
bool operator<(const DDL &p) const
{
if