A.DDL的恐惧
ZJM 有 n 个作业,每个作业都有自己的 DDL,如果 ZJM 没有在 DDL 前做完这个作业,那么老师会扣掉这个作业的全部平时分。
所以 ZJM 想知道如何安排做作业的顺序,才能尽可能少扣一点分。
请你帮帮他吧!
Input
输入包含T个测试用例。输入的第一行是单个整数T,为测试用例的数量。
每个测试用例以一个正整数N开头(1<=N<=1000),表示作业的数量。
然后两行。第一行包含N个整数,表示DDL,下一行包含N个整数,表示扣的分。
Output
对于每个测试用例,您应该输出最小的总降低分数,每个测试用例一行。
sample input
3
3
3 3 3
10 5 1
3
1 3 1
6 2 3
7
1 4 6 4 2 4 3
3 2 1 7 6 5 4
sample output
0
3
5
分析:贪心,从后向前,每个时间点把此时间点在任务DDL之前的任务加入一个最大堆中,做堆顶的任务。无论是否可以做任务,移动到下一个前一个时间点。时间从后向前,因为DDL靠前的任务无法被靠后时间点所做任务影响。注意代码中两个重载比较一个是在数组中排好序,DDL第一;另一个是在堆中,score第一
//
// Created by haofeng on 3/13/20.
//
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
struct test{
int point;
int DDL;
bool operator <(test&t2){
//先按DDL,再按分数排
if(this->DDL!=t2.DDL){
return this->DDL<t2.DDL;}
return this->point<t2.point;
}
bool operator ()(test&t1,test&t2){
//()运算符
if(t1.point!=t2.point){
return t1.point<t2.point;}
return t1.DDL<t2.DDL;
}
};
bool cmp (test& t1,test&t2){
//先按DDL,再按分数排
if(t1.DDL!=t2.DDL){
return t1.DDL<t2.DDL;}
return t1.point<t2.point;
}
test TESTS [1000];
bool DO[1000]={
false};
int N;//每一组数量
int T;//测试数量
priority_queue<test,vector<test>,test> h;//最大堆
int main(){
cin>>T;
while (T>0){
T--