SDU_week4_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
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.问题描述 每一个作业Ji都有两项任务分别在2台机器上完成.每个作业必须先有机器1处理,然后再由机器2处理.作业Ji需要机器j的处理时间为tji.对于一个确定的作业调度,设Fji是作业i在机器j上完 ...
- 【老生谈算法】MATLAB实现车间作业调度问题(JSP)遗传算法通用源码——JSP
MATLAB实现车间作业调度问题(JSP)遗传算法通用源代码 1.原文下载: 本算法原文如下,有需要的朋友可以点击进行下载 序号 原文(点击下载) 本项目原文 [老生谈算法]车间作业调度问题(JSP) ...
- 回溯法解决批处理作业调度问题
唉,这是作为一个失败的开端.但是,我不害怕失败的!今天稍微晚点睡觉,因为中午多睡啦~最近被王晓东老师的<计算机算法设计与分析>(第4版)折磨得够呛.不会说些文雅的话,这的确是事实.基础差, ...
- 回溯算法批处理作业调度问题
1.问题描述 给定n个作业的集合J={j1,j2,j3,-jn},每一个作业都有两项任务分别在两台机器上完成.每个作业必须先由机器1处理,再由机器2处理.作业Ji需要机器j的处理时间为tij,设Fij ...
- 实验4 贪心法(作业调度问题)
1.问题的已知 设有n个独立的作业{1, 2, -, n},由m台相同的机器{M1, M2, -, Mm}进行加工处理,作业i所需的处理时间为ti(1≤i≤n),每个作业均可在任何一台机器上加工处理, ...
- Week4—A—DDL的恐惧
题目描述: ZJM 有 n 个作业,每个作业都有自己的 DDL,如果 ZJM 没有在 DDL 前做完这个作业,那么老师会扣掉这个作业的全部平时分. 所以 ZJM 想知道如何安排做作业的顺序,才能尽可能 ...
- 作业调度问题java代码_Tabu Search求解作业车间调度问题(Job Shop Scheduling)-附Java代码...
本文来源于公众号[程序猿声],作者舟寒丶 作业车间调度问题 问题模型 举个栗子 有关禁忌搜索算法的内容,公众号内有详细教程: 大家可以点击超链接回顾相关知识,这里就不再细说了. 一般而言,用禁忌搜索算 ...
- 分枝限界法求解流水线作业调度问题
问题描述 有n个作业(编号为1-n)要在由两台机器M1和M2组成的流水线上完成加工.每个作业加工的顺序都是先在M1上加工,然后在M2上加工.M1和M2加工作业i所需的时间分别为ai和bi(1≤i≤n) ...
- 流水线作业调度问题c语言,流水线作业调度问题
题目: 感觉有些 , 还要思考的地方 , 留下了 ,以后看.... Description N个作业{1,2,---,n}要在由两台机器M1和M2组成的流水线上完成加工.每个作业加工的顺序都是先在M1 ...
最新文章
- java旅游系统项目经验_谁能跟我介绍一下Java 项目经验,刚进入这个行业。
- Android 目录
- Spring AMQP 教程
- mysql 序列化存储_如何将类序列化并直接存储入数据库
- java基础问题集锦一
- Go操作MySql Memache Mongodb
- Eclipse的下载Spring Tool Suite(sts)
- 操作系统原理实验——实验一 Linux基本操作
- 最新省市区json字符串
- Ubuntu系统清理工具
- console.log详解
- Selenium IDE安装与运行
- 手把手教你用TensorFlow、Keras打造美剧《硅谷》中的“识别热狗”APP
- excal怎么设置模板阈值
- teb planner error
- 红色高端爱家Aijiacms大型房产门户系统V9网站源码+带WAP
- R语言逻辑回归 logistic regression
- lisp写标高线_cad自动写标高lisp
- Python一张足够大的纸,纸质厚度0.5,请问对折多少次,才能到达珠穆朗玛峰的高度。(珠峰最新数据:8844.43)
- HTML怎么把图片占满表格,CSS解决表格或图片内容将页面撑开的办法
热门文章
- des加解密(JavaScriptJava)
- 阿里影业的稳健业绩来源:科技+内容塑造韧性,应对市场变化
- Glide加载动态图片
- Oauth2系列2:授权码模式
- java语言读后感_《Java语言程序设计基础篇》读后感锦集
- Google Colab Colaboratory谷歌推出的免费GPU服务器使用教程
- picgo 上传成功,无法显示图片
- XShell免费版的安装配置教程以及使用教程—解决“WARNINGThe remote SSH server rejected X11 forwarding request.“警告
- 手机哔哩哔哩如何转换html5,手机b站(哔哩哔哩)账号up主头像图片如何设置?怎么保存到相册里面...
- java操作es之各种高级查询