贪心 任务调度问题
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;
}
以上是关于贪心 任务调度问题的主要内容,如果未能解决你的问题,请参考以下文章