java 工作排序(Job Sequencing Problem)

????????給定一個作業數組,其中每個作業都有一個截止期限,如果作業在截止期限之前完成,則可獲得相關利潤。此外,每個作業都占用一個單位時間,因此任何作業的最小可能截止期限都是 1。如果一次只能安排一項作業,則最大化總利潤。

例子:?
輸入:四個工作,截止日期和利潤如下
JobID 截止期限 利潤
? 一 4 20 ??
? 二 1 10
? 三 1 40 ?
? 四 1 30

輸出:以下是工作利潤最大的序列:c、a ??

輸入: ?五項工作,截止日期和利潤如下

JobID 截止期限 利潤

? a 2 100
? b 1 19
? c 2 27
? d 1 25
? e 3 15

輸出:以下是工作利潤最大的序列:c,a,e

樸素方法:要解決問題,請遵循以下想法:

生成給定作業集的所有子集,并檢查各個子集是否可行。跟蹤所有可行子集中的最大利潤。

作業排序問題的貪婪方法:
貪婪地首先選擇利潤最高的工作,方法是按利潤降序對工作進行排序。這將有助于最大化總利潤,因為為每個時間段選擇利潤最高的工作最終將最大化總利潤

按照給定的步驟解決問題:

按利潤的降序對所有工作進行排序。?
按利潤遞減的順序對工作進行迭代。對于每項工作,執行以下操作:?
找到一個時間段 i,使得時間段為空、i < 截止時間且 i 最大。將作業放入?
此時間段并將此時間段標記為已填充。?
如果不存在這樣的 i,則忽略該工作。?
下面是上述方法的實現:?

// Java code for the above approach?
?
import java.util.*;
?
class Job {
? ?
? ? // Each job has a unique-id,profit and deadline
? ? char id;
? ? int deadline, profit;
?
? ? // Constructors
? ? public Job() {}
?
? ? public Job(char id, int deadline, int profit)
? ? {
? ? ? ? this.id = id;
? ? ? ? this.deadline = deadline;
? ? ? ? this.profit = profit;
? ? }
?
? ? // Function to schedule the jobs take 2 arguments
? ? // arraylist and no of jobs to schedule
? ? void printJobScheduling(ArrayList<Job> arr, int t)
? ? {
? ? ? ? // Length of array
? ? ? ? int n = arr.size();
? ? ? ?
? ? ? ? // Sort all jobs according to decreasing order of
? ? ? ? // profit
? ? ? ? Collections.sort(arr,
? ? ? ? ? ? ? ? ? ? ? ? ?(a, b) -> b.profit - a.profit);
?
? ? ? ? // To keep track of free time slots
? ? ? ? boolean result[] = new boolean[t];
?
? ? ? ? // To store result (Sequence of jobs)
? ? ? ? char job[] = new char[t];
?
? ? ? ? // Iterate through all given jobs
? ? ? ? for (int i = 0; i < n; i++) {
? ? ? ? ? ? // Find a free slot for this job (Note that we
? ? ? ? ? ? // start from the last possible slot)
? ? ? ? ? ? for (int j
? ? ? ? ? ? ? ? ?= Math.min(t - 1, arr.get(i).deadline - 1);
? ? ? ? ? ? ? ? ?j >= 0; j--) {
? ? ? ? ? ? ? ? // Free slot found
? ? ? ? ? ? ? ? if (result[j] == false) {
? ? ? ? ? ? ? ? ? ? result[j] = true;
? ? ? ? ? ? ? ? ? ? job[j] = arr.get(i).id;
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
?
? ? ? ? // Print the sequence
? ? ? ? for (char jb : job)
? ? ? ? ? ? System.out.print(jb + " ");
? ? ? ? System.out.println();
? ? }
?
? ? // Driver's code
? ? public static void main(String args[])
? ? {
? ? ? ? ArrayList<Job> arr = new ArrayList<Job>();
? ? ? ? arr.add(new Job('a', 2, 100));
? ? ? ? arr.add(new Job('b', 1, 19));
? ? ? ? arr.add(new Job('c', 2, 27));
? ? ? ? arr.add(new Job('d', 1, 25));
? ? ? ? arr.add(new Job('e', 3, 15));
?
? ? ? ? System.out.println(
? ? ? ? ? ? "Following is maximum profit sequence of jobs");
?
? ? ? ? Job job = new Job();
?
? ? ? ? // Function call
? ? ? ? job.printJobScheduling(arr, 3);
? ? }
}
?
// This code is contributed by Aditya Kumar (adityakumar129)??

輸出
以下是工作的最大利潤序列

c a e?

計算機輔助設計
時間復雜度: O(N 2 )
輔助空間: O(N)

使用優先級隊列(最大堆)的作業排序問題:
按截止日期的升序對作業進行排序,然后從末尾開始迭代,計算每兩個連續截止日期之間的可用時隙。當空時隙可用且堆不為空時,將作業的利潤包含在最大堆的根部,因為這有助于為每組可用時隙選擇利潤最大的作業。

下面是上述方法的實現:

// Java implementation of above approach
?
// Program to find the maximum profit
// job sequence from a given array
// of jobs with deadlines and profits
import java.util.*;
?
public class GFG {
?
? ? // a class to represent job
? ? static class Job {
? ? ? ? char job_id;
? ? ? ? int deadline;
? ? ? ? int profit;
? ? ? ? Job(char job_id, int deadline, int profit)
? ? ? ? {
? ? ? ? ? ? this.deadline = deadline;
? ? ? ? ? ? this.job_id = job_id;
? ? ? ? ? ? this.profit = profit;
? ? ? ? }
? ? }
?
? ? static void printJobScheduling(ArrayList<Job> arr)
? ? {
? ? ? ? int n = arr.size();
?
? ? ? ? // sorting the array on the
? ? ? ? // basis of their deadlines
? ? ? ? Collections.sort(arr, (a, b) -> {
? ? ? ? ? ? return a.deadline - b.deadline;
? ? ? ? });
?
? ? ? ? // initialise the result array and maxHeap
? ? ? ? ArrayList<Job> result = new ArrayList<>();
? ? ? ? PriorityQueue<Job> maxHeap = new PriorityQueue<>(
? ? ? ? ? ? (a, b) -> { return b.profit - a.profit; });
?
? ? ? ? // starting the iteration from the end
? ? ? ? for (int i = n - 1; i > -1; i--) {
? ? ? ? ? ? int slot_available;
? ? ? ? ? ?
? ? ? ? ? ? // calculate slots between two deadlines
? ? ? ? ? ? if (i == 0) {
? ? ? ? ? ? ? ? slot_available = arr.get(i).deadline;
? ? ? ? ? ? }
? ? ? ? ? ? else {
? ? ? ? ? ? ? ? slot_available = arr.get(i).deadline
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?- arr.get(i - 1).deadline;
? ? ? ? ? ? }
?
? ? ? ? ? ? // include the profit of job(as priority),
? ? ? ? ? ? // deadline and job_id in maxHeap
? ? ? ? ? ? maxHeap.add(arr.get(i));
?
? ? ? ? ? ? while (slot_available > 0
? ? ? ? ? ? ? ? ? ?&& maxHeap.size() > 0) {
?
? ? ? ? ? ? ? ? // get the job with max_profit
? ? ? ? ? ? ? ? Job job = maxHeap.remove();
?
? ? ? ? ? ? ? ? // reduce the slots
? ? ? ? ? ? ? ? slot_available--;
?
? ? ? ? ? ? ? ? // include the job in the result array
? ? ? ? ? ? ? ? result.add(job);
? ? ? ? ? ? }
? ? ? ? }
?
? ? ? ? // jobs included might be shuffled
? ? ? ? // sort the result array by their deadlines
? ? ? ? Collections.sort(result, (a, b) -> {
? ? ? ? ? ? return a.deadline - b.deadline;
? ? ? ? });
? ? ? ?
? ? ? ? for (Job job : result) {
? ? ? ? ? ? System.out.print(job.job_id + " ");
? ? ? ? }
? ? ? ?
? ? ? ? System.out.println();
? ? }
?
? ? // Driver's Code
? ? public static void main(String[] args)
? ? {
? ? ? ? ArrayList<Job> arr = new ArrayList<Job>();
?
? ? ? ? arr.add(new Job('a', 2, 100));
? ? ? ? arr.add(new Job('b', 1, 19));
? ? ? ? arr.add(new Job('c', 2, 27));
? ? ? ? arr.add(new Job('d', 1, 25));
? ? ? ? arr.add(new Job('e', 3, 15));
? ? ? ?
? ? ? ? System.out.println("Following is maximum "
? ? ? ? ? ? ? ? ? ? ? ? ? ?+ "profit sequence of jobs");
?
? ? ? ? // Function call
? ? ? ? printJobScheduling(arr);
? ? }
}
?
// This code is contributed by Karandeep Singh?

輸出
以下是作業的最大利潤序列

a c e?

時間復雜度: O(N log N)
輔助空間: O(N)?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/22083.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/22083.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/22083.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

代碼隨想錄算法訓練營Day60 | 84.柱狀圖中最大的矩形 | Python | 個人記錄向

注&#xff1a;今天是代碼隨想錄訓練營的最后一天啦&#xff01;&#xff01;&#xff01; 本文目錄 84.柱狀圖中最大的矩形做題看文章 以往忽略的知識點小結個人體會 84.柱狀圖中最大的矩形 代碼隨想錄&#xff1a;84.柱狀圖中最大的矩形 Leetcode&#xff1a;84.柱狀圖中最…

解決使用Python檢查本地網絡中運行的Web服務器的問題

如果我們要檢查本地網絡中運行的 Web 服務器&#xff0c;可以使用 Python 的 socket 模塊來進行網絡連接測試。以下是一個簡單的示例代碼&#xff0c;演示如何檢查本地網絡中運行的 Web 服務器&#xff1a; 1、問題背景 在學習如何使用 Python 時&#xff0c;一位用戶希望編寫…

從零開始:騰訊云輕量應用服務器上部署MaxKB項目(基于LLM大語言模型的知識庫問答系統)

使用騰訊云輕量應用服務器部署和使用MaxKB項目 前言 一&#xff0c; MaxKB介紹 MaxKB是基于LLM大語言模型的知識庫問答系統&#xff0c;旨在成為企業的最強大腦。它支持開箱即用&#xff0c;無縫嵌入到第三方業務系統&#xff0c;并提供多模型支持&#xff0c;包括主流大模型…

我們如何收到衛星信號?(導航電文,載波與測距碼)

衛星信號 在介紹所有衛星信號之前&#xff0c;首先要明確一些概念&#xff1a; 所有的衛星信號&#xff0c;都是一段電磁波&#xff0c;用戶接收的&#xff0c;也是一段電磁波。 但是我們認知中的電磁波&#xff0c;就是一段波&#xff0c;就像我們打出去的交一樣&#xff0c…

【UML用戶指南】-03-UML的14種圖

目錄 1、結構圖 1、類圖&#xff08;class diagram&#xff09; 2、對象圖&#xff08;object diagram&#xff09; 3、構件圖 &#xff08;component diagram&#xff09; 4、組合結構圖 5、包圖&#xff08;package diagram&#xff09; 6、部署圖&#xff08;deploym…

Android輸入法IME(二)

2. IME初始化啟動流程 2.1. IME客戶端&#xff08;IMM&#xff09;初始化流程 涉及代碼文件路徑&#xff1a; frameworks/base/core/java/android/view/ViewRootImpl.java frameworks/base/core/java/android/view/WindowManagerGlobal.java frameworks/base/core/java/andro…

【kubernetes】k8s的面試寶典,等你來拿哦

目錄 一、pod的生命周期 二、創建 pod 的工作流程 三、ingres 有哪些組件并且描述出組件作用 &#xff1f; 四、ingress 的工作原理 五、ingress 暴露服務的方式 六、pod 的組成 七、pod的本身性質&#xff08;pod的種類與說明&#xff09; 八、k8s命令 8.1在k8s中如何…

零基礎入門學習Python第二階04SQL詳解03

MySQL 新特性 JSON類型 很多開發者在使用關系型數據庫做數據持久化的時候&#xff0c;常常感到結構化的存儲缺乏靈活性&#xff0c;因為必須事先設計好所有的列以及對應的數據類型。在業務發展和變化的過程中&#xff0c;如果需要修改表結構&#xff0c;這絕對是比較麻煩和難…

AppStore搜索優化方法(ASO)

在競爭激烈的 App Store 中&#xff0c;如何讓你的應用脫穎而出&#xff0c;吸引更多用戶下載&#xff1f;其實從官方文檔描述中可以總結一些優化技巧&#xff0c;這是官方描述地址&#xff1a;搜索優化 – App Store – Apple Developer。通過官方描述我們可以總結到影響搜索結…

commander.js 入門指南:構建強大的命令行界面 (全網最全教程)

在Node.js的世界里&#xff0c;創建用戶友好的命令行界面&#xff08;CLI&#xff09;對于許多應用程序和工具來說至關重要。Commander.js 是一個廣受歡迎的 Node.js 包&#xff0c;它為開發者提供了一套簡潔而強大的 API&#xff0c;用于快速創建功能完備、用戶友好的命令行界…

如何用TCC方案輕松實現分布式事務一致性

本文作者:小米,一個熱愛技術分享的29歲程序員。如果你喜歡我的文章,歡迎關注我的微信公眾號“軟件求生”,獲取更多技術干貨! 哈嘍,大家好!我是小米,一個熱愛技術的活力小青年,今天要和大家分享的是一種在分布式系統中實現事務的一種經典方案——TCC(Try Confirm Canc…

【Ubuntu】超詳細安裝Ubuntu系統

鑒于有些小伙伴在安裝Ubuntu系統的時候遇到很多問題&#xff0c;因此打算編寫一篇記錄一下安裝Ubuntu系統的整個過程~互相學習&#xff01; 一、制作U盤啟動 準備一個大于8G以上的U盤&#xff0c;這里我使用的是16G的U盤下載UltraISO工具 網站地址&#xff1a;UltraISO準備Ub…

C++ Primer 第五版 第15章 面向對象程序設計

面向對象程序設計基于三個基本概念&#xff1a;數據抽象、繼承和動態綁定。 繼承和動態綁定對編寫程序有兩方面的影響&#xff1a;一是我們可以更容易地定義與其他類相似但不完全相同的新類&#xff1b;二是在使用這些彼此相似的類編寫程序時&#xff0c;我們可以在一定程度上…

HTML靜態網頁成品作業(HTML+CSS)—— 金寶貝兒童教育機構介紹網頁(2個頁面)

&#x1f389;不定期分享源碼&#xff0c;關注不丟失哦 文章目錄 一、作品介紹二、作品演示三、代碼目錄四、網站代碼HTML部分代碼 五、源碼獲取 一、作品介紹 &#x1f3f7;?本套采用HTMLCSS&#xff0c;未使用Javacsript代碼&#xff0c;共有2個頁面。 二、作品演示 三、代…

Stable diffusion prompts 使用語法、參數講解、插件安裝教程

Stable diffusion prompts 使用語法、參數講解、插件安裝教程 本文基于 Stable diffusion WebUI 進行講解&#xff08;安裝在 AutoDL 上&#xff0c;安裝在本地電腦上的也同樣適用本教程&#xff09;。 初始界面&#xff1a; 文件目錄結構&#xff1a; 上圖紅框中的 4 個文件…

requests模塊編寫漏洞檢測工具

#嘗試使用python登錄pikachu爆破模塊 #發送post數據包&#xff0c;包含用戶名密碼&#xff0c;對接受到的響應進行判斷&#xff0c;如何為登錄成功 #爆破密碼 with open(passwor.txt,r) as f: passwordf.readlines() for i in password: data {username: admin, password: i, …

數據結構——算法和算法效率的度量

目錄 一、引言 二、算法 1 算法的基本概念 2 算法的復雜度 2.1 時間復雜度 2.1.1 概念 2.1.2 大O的漸進表示 3 算法的空間復雜度 3.1 概念 3.2 實例 4 實例分析 5 結論 一、引言 大家在寫代碼的時候有沒有發現寫同樣功能的代碼有多種不同的寫法&#xff0c;而不同的代…

51種企業應用架構模式詳解

01 什么是企業應用 我的職業生涯專注于企業應用&#xff0c;因此&#xff0c;這里所談及的模式也都是關于企業應用的。&#xff08;企業應用還有一些其他的說法&#xff0c;如“信息系統”或更早期的“數據處理”。&#xff09;那么&#xff0c;這里的“企業應用”具體指的是什…

[原型資源分享]經典產品餓了么UI模版部件庫

?部件庫預覽鏈接&#xff1a;https://f13gm0.axshare.com 支持版本: Axrure RP 8 文件大小: 3MB 文檔內容介紹 基本部件&#xff1a;表單樣式&#xff1a;12款、數據樣式&#xff1a;10款、服務樣式&#xff1a;6款、導航&#xff1a;5款、業務組件&#xff1a;7款、 模板…

python把簡體中文轉換為繁體中文

Python 可以使用第三方庫來將簡體中文&#xff08;簡體中文&#xff09;轉換為繁體中文&#xff08;繁體中文&#xff09;。一個常用的庫是 opencc-python-reimplemented&#xff0c;它是 Open Chinese Convert (OpenCC) 的 Python 實現&#xff0c;OpenCC 是一個開源的中文簡繁…