码迷,mamicode.com
首页 > 其他好文 > 详细

贪心 任务调度问题

时间:2016-10-14 00:24:23      阅读:331      评论:0      收藏:0      [点我收藏+]

标签:

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

贪心 任务调度问题

标签:

原文地址:http://www.cnblogs.com/lvbcy/p/5958620.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!