首页 > 代码库 > 贪心 任务调度问题

贪心 任务调度问题

一个单位时间任务是恰好需要一个单位时间完成的任务。给定一个单位时间任务的有限集 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 555int 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;}

贪心 任务调度问题