首页 > 代码库 > 贪心 任务调度问题
贪心 任务调度问题
一个单位时间任务是恰好需要一个单位时间完成的任务。给定一个单位时间任务的有限集 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;}
贪心 任务调度问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。