山东大学程序设计思维学习笔记作业4

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--
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值