貪心 任務調度問題


一個單位時間任務是恰好需要一個單位時間完成的任務。給定一個單位時間任務的有限集 S。關於S 的一個時間表用於描述S 中單位時間任務的執行次序。時間表中第1 個任務從時間0 開始執行直至時間1 結束,第2 個任務從時間1 開始執行至時間2 結束,…,第n個任務從時間n-1 開始執行直至時間n結束。具有截止時間和誤時懲罰的單位時間任務時間表問題可描述如下:
(1) n 個單位時間任務的集合S={1,2,…,n}(n≤500);
(2) 任務i的截止時間d[i],1≤i≤n,1≤d[i]≤n,即要求任務i在時間d[i]之前結束;
(3) 任務i 的誤時懲罰1≤w[i]<1000,1≤i≤n,即任務i 未在時間d[i]之前結束將招致w[i]的懲罰;若按時完成則無懲罰。

任務時間表問題要求確定S 的一個時間表(最優時間表)使得總誤時懲罰達到最小。

題解:根據罰時的長短進行排序,將罰時時間長的放在前面。開一個數組作為時間槽,記錄每個單位時間是否有任務安排。若截止日期相同,根據時間長短判斷哪個優先,盡量將任務安排在截至時間完成,否則放在放在前一天,以此類推。若在截至時間前都有任務安排,則舍去,增加到罰時中。

#include <iostream> #include <stdio.h> #define maxn 555 int d[maxn]; int w[maxn]; bool done[maxn]; using namespace std; int main() { int n,i,j,t; int sum=0; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&d[i]); } for(i=0;i<n;i++) { scanf("%d",&w[i]); }
/*按照時間進行排序,截止時間也隨罰時排序*/
for(i=0;i<n-1;i++) { for(j=0;j<n-1-i;j++) { if(w[j]<w[j+1]) { t=w[j]; w[j]=w[j+1]; w[j+1]=t; t=d[j]; d[j]=d[j+1]; d[j+1]=t; } } }
/*done[]為時間槽,表示已有任務安排,j表示第幾個單位時間*/
 for(i=0;i<n;i++) { for(j=d[i]; j;j--) { if(done[j]==0) { done[j]=1; break; } }
/*若都有安排,則將其加入總罰時時間sum*/
 if(j==0) { sum+=w[i]; } } printf("%d",sum); return 0; }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM