贪心 任务调度问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心 任务调度问题相关的知识,希望对你有一定的参考价值。

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

以上是关于贪心 任务调度问题的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode]621. 任务调度器(贪心)

怎么优化hadoop任务调度算法

贪心算法----区间覆盖问题(POJ2376)

hdu2037 今年暑假不AC[贪心][区间调度问题]

贪心法----------区间调度问题

贪心法----------区间调度问题