题目描述

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

Hint
上方有三组样例。
对于第一组样例,有三个作业它们的DDL均为第三天,ZJM每天做一个正好在DDL前全部做完,所以没有扣分,输出0。
对于第二组样例,有三个作业,它们的DDL分别为第一天,第三天、第一天。ZJM在第一天做了第一个作业,第二天做了第二个作业,共扣了3分,输出3。

分析

题目要求扣分最少,得分最多一个意思,所求输出是无法安排的任务的分数总和。

本题我用了两种方法实现。
法一:将 n 个 deadline 根据分数从大到小排序,依次遍历。对于第i个 deadline,根据自己ddl后往前遍历,一旦找到空闲时段则安排为第i个 deadline(并将这天标为已使用),找不到就记录该任务的分数(要扣的分)。时间复杂度为O(n^2)

法二:从后往前枚举每一天,给每一天安排任务。枚举到第x天时,将所有 deadline在这天的加入最大堆中。再从最大堆中选取一个价值最大的 deadline 安排在第 x 天。最后堆中剩余任务的point之和即为扣分之和。时间复杂度为O(nlogn)

特别注意

STL中priority_queue重载跟正常情况相反!
在结构体中重载比较方法:

struct hw {int point;int ddl;friend bool operator <(hw a, hw b) {//priority_queue重载跟正常情况相反!if (a.point != b.point) return a.point < b.point;//分值大的先完成else return a.ddl < b.ddl;//作业能拖则拖,给前面留时间   }
};

声明容器:

priority_queue<hw> q;

使用容器:

q.push(homework[day]);

代码

easy版

#define _CRT_SECURE_NO_WARNINGS
#define _ ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)#include <bits/stdc++.h>
//#include <iostream>
//#include<algorithm>using namespace std;struct hw {int point;int ddl;
};bool cmp(hw a, hw b) {if (a.point != b.point) return a.point > b.point;//分值大的先完成else return a.ddl > b.ddl;//作业能拖则拖,给前面留时间
}hw homework[1009];//作业
bool taken[1009];//某天是否被占用int main()
{int N;//样例数cin >> N;while (N--){memset(homework, 0, sizeof(homework));memset(taken, 0, sizeof(taken));int n;//作业数量cin >> n;for (int i = 1; i <= n; i++)cin >> homework[i].ddl;for (int i = 1; i <= n; i++)cin >> homework[i].point;sort(homework + 1, homework + n + 1, cmp);int err = 0;//扣分数for (int i = 1; i <= n; i++) {int ddl = homework[i].ddl;for (int j = ddl; j >= 0; j--) {if (j == 0) {err += homework[i].point;break;}if (taken[j] == false) {taken[j] = true;break;}}}cout << err << endl;}return 0;
}

hard版

#define _CRT_SECURE_NO_WARNINGS
#define _ ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)#include <bits/stdc++.h>
//#include <iostream>
//#include<algorithm>using namespace std;struct hw {int point;int ddl;friend bool operator <(hw a, hw b) {//priority_queue重载跟正常情况相反!if (a.point != b.point) return a.point < b.point;//分值大的先完成else return a.ddl < b.ddl;//作业能拖则拖,给前面留时间   }
};bool cmp(hw a, hw b) {return a.ddl < b.ddl;//作业能拖则拖,给前面留时间
}hw homework[1009];//作业
//bool taken[1009];//某天是否被占用
priority_queue<hw> q;int main()
{int N;//样例数cin >> N;while (N--){memset(homework, 0, sizeof(homework));//memset(taken, 0, sizeof(taken));int n;//作业数量cin >> n;for (int i = 1; i <= n; i++)cin >> homework[i].ddl;for (int i = 1; i <= n; i++)cin >> homework[i].point;sort(homework + 1, homework + n + 1, cmp);//按照完成时间升序int err = 0;//扣分数int day = n;//总天数,倒着入队for (int i = n ; i >= 1; i--) {while (homework[day].ddl == i) {q.push(homework[day]);day--;}if (!q.empty()){q.pop();}}while (!q.empty()){//q中剩余的就是不能调度的任务,求和即可err += q.top().point;q.pop();}cout << err << endl;}return 0;
}

SDU_week4_A - DDL 的恐惧(贪心+作业调度问题)相关推荐

  1. 批处理作业调度问题 ——回溯法详解

    1.问题描述 每一个作业Ji都有两项任务分别在2台机器上完成.每个作业必须先有机器1处理,然后再由机器2处理.作业Ji需要机器j的处理时间为tji.对于一个确定的作业调度,设Fji是作业i在机器j上完 ...

  2. 【老生谈算法】MATLAB实现车间作业调度问题(JSP)遗传算法通用源码——JSP

    MATLAB实现车间作业调度问题(JSP)遗传算法通用源代码 1.原文下载: 本算法原文如下,有需要的朋友可以点击进行下载 序号 原文(点击下载) 本项目原文 [老生谈算法]车间作业调度问题(JSP) ...

  3. 回溯法解决批处理作业调度问题

    唉,这是作为一个失败的开端.但是,我不害怕失败的!今天稍微晚点睡觉,因为中午多睡啦~最近被王晓东老师的<计算机算法设计与分析>(第4版)折磨得够呛.不会说些文雅的话,这的确是事实.基础差, ...

  4. 回溯算法批处理作业调度问题

    1.问题描述 给定n个作业的集合J={j1,j2,j3,-jn},每一个作业都有两项任务分别在两台机器上完成.每个作业必须先由机器1处理,再由机器2处理.作业Ji需要机器j的处理时间为tij,设Fij ...

  5. 实验4 贪心法(作业调度问题)

    1.问题的已知 设有n个独立的作业{1, 2, -, n},由m台相同的机器{M1, M2, -, Mm}进行加工处理,作业i所需的处理时间为ti(1≤i≤n),每个作业均可在任何一台机器上加工处理, ...

  6. Week4—A—DDL的恐惧

    题目描述: ZJM 有 n 个作业,每个作业都有自己的 DDL,如果 ZJM 没有在 DDL 前做完这个作业,那么老师会扣掉这个作业的全部平时分. 所以 ZJM 想知道如何安排做作业的顺序,才能尽可能 ...

  7. 作业调度问题java代码_Tabu Search求解作业车间调度问题(Job Shop Scheduling)-附Java代码...

    本文来源于公众号[程序猿声],作者舟寒丶 作业车间调度问题 问题模型 举个栗子 有关禁忌搜索算法的内容,公众号内有详细教程: 大家可以点击超链接回顾相关知识,这里就不再细说了. 一般而言,用禁忌搜索算 ...

  8. 分枝限界法求解流水线作业调度问题

    问题描述 有n个作业(编号为1-n)要在由两台机器M1和M2组成的流水线上完成加工.每个作业加工的顺序都是先在M1上加工,然后在M2上加工.M1和M2加工作业i所需的时间分别为ai和bi(1≤i≤n) ...

  9. 流水线作业调度问题c语言,流水线作业调度问题

    题目: 感觉有些 , 还要思考的地方 , 留下了 ,以后看.... Description N个作业{1,2,---,n}要在由两台机器M1和M2组成的流水线上完成加工.每个作业加工的顺序都是先在M1 ...

最新文章

  1. java旅游系统项目经验_谁能跟我介绍一下Java 项目经验,刚进入这个行业。
  2. Android 目录
  3. Spring AMQP 教程
  4. mysql 序列化存储_如何将类序列化并直接存储入数据库
  5. java基础问题集锦一
  6. Go操作MySql Memache Mongodb
  7. Eclipse的下载Spring Tool Suite(sts)
  8. 操作系统原理实验——实验一 Linux基本操作
  9. 最新省市区json字符串
  10. Ubuntu系统清理工具
  11. console.log详解
  12. Selenium IDE安装与运行
  13. 手把手教你用TensorFlow、Keras打造美剧《硅谷》中的“识别热狗”APP
  14. excal怎么设置模板阈值
  15. teb planner error
  16. 红色高端爱家Aijiacms大型房产门户系统V9网站源码+带WAP
  17. R语言逻辑回归 logistic regression
  18. lisp写标高线_cad自动写标高lisp
  19. Python一张足够大的纸,纸质厚度0.5,请问对折多少次,才能到达珠穆朗玛峰的高度。(珠峰最新数据:8844.43)
  20. HTML怎么把图片占满表格,CSS解决表格或图片内容将页面撑开的办法

热门文章

  1. des加解密(JavaScriptJava)
  2. 阿里影业的稳健业绩来源:科技+内容塑造韧性,应对市场变化
  3. Glide加载动态图片
  4. Oauth2系列2:授权码模式
  5. java语言读后感_《Java语言程序设计基础篇》读后感锦集
  6. Google Colab Colaboratory谷歌推出的免费GPU服务器使用教程
  7. picgo 上传成功,无法显示图片
  8. XShell免费版的安装配置教程以及使用教程—解决“WARNINGThe remote SSH server rejected X11 forwarding request.“警告
  9. 手机哔哩哔哩如何转换html5,手机b站(哔哩哔哩)账号up主头像图片如何设置?怎么保存到相册里面...
  10. java操作es之各种高级查询