问答题

阅读下列算法说明和流程图,根据回答下列问题。
[说明]
某机器上需要处理n个作业job1,job2,…,jobn,其中:
(1)每个作业jobi(1≤i≤n)的编号为i,jobi有一个收益值p[i]和最后期限值d[i];
(2)机器在一个时刻只能处理一个作业,而且每个作业需要一个单位时间进行处理,一旦作业开始就不可中断,每个作业的最后期限值为单位时间的正整数倍;
(3) job1~jobn的收益值呈非递增顺序排列,即p[1]≥p[2]≥...≥p[n];
(4)如果作业jobi在其期限之内完成,则获得收益p[i];如果在其期限之后完成,则没有收益。
为获得较高的收益,采用贪心策略求解在期限之内完成的作业序列。图8-22是基于贪心策略求解该问题的流程图。


(1)整型数组J[]有n个存储单元,变量k表示在期限之内完成的作业数,J[1..k]存储所有能够在期限内完成的作业编号,数组J[1..k]里的作业按其最后期限非递减排序,即d[J[1]]≤...≤d[J[k]]。
(2)为了便于在数组J中加入作业,增加一个虚拟作业job0,并令d[0]=0,J[0]=0。
(3)算法大致思想是:先将作业job1的编号1放入J[1],然后,依次对每个作业jobi(2≤i≤n)进行判定,看其能否插入到数组J中。若能,则将其编号插入到数组J的适当位置,并保证J中作业按其最后期限非递减排列;否则不插入。
jobi能插入数组J的充要条件是:jobi和数组J中已有作业均能在其期限之内完成。
(4)流程图中的主要变量说明如下。
i:循环控制变量,表示作业的编号。
k:表示在期限内完成的作业数。
r:若jobi能插入数组J,则其在数组J中的位置为r+1。
q:循环控制变量,用于移动数组J中的元素。
[问题2]
假设有6个作业job1,job2,…,job6;完成作业的收益数组p=(p[1],p[2],p[3],p[4],p[5],p[6])=(90,80,50,30,20,10);每个作业的处理期限数组d=(d[1],d[2],d[3],d[4],d[5],d[6])=(1,2,1,3,4,3)。
请应用试题中描述的贪心策略算法,给出在期限之内处理的作业编号序列______(按作业处理的顺序给出),得到的总收益为______。

【参考答案】

A,B,D,E或jobA、jobB、jobD、jobE及其等价描述形式
BB0
热门 试题

问答题
请阅读以下技术说明、类图及C++代码,回答下列问题。 [说明] 已知某企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批。主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5万元至10万元(不包括10万元)的采购单,董事长可以审批10万元至50万元(不包括50万元)的采购单,50万元及以上的采购单就需要开会讨论决定。 采用责任链设计模式(Chain of Responsibility)对上述过程进行设计后得到的类图如图8-23所示。 [C++代码] #include <String> #include <iostream> using namespace std; class PurchaseRequest public: double Amount; 采购的金额 int Number; 采购的单号 string Purpose; 采购的目的 ; class Approver 审批者类 public: Approver() successor=NULL; virtual void ProcessRequest (PurchaseRequest aRequest) if successor !=NULL) successor-> ______; void SetSuccessor (Approver *aSuccesssor) successor=aSuccesssor; private: ______ successor; ; class Congress:public Approver public: void ProcessRequest (PurohaseRequest aRequest) if (aRequest.Amount>:500000) *决定是否审批的代码省略* else ______ ProcessRequest(aRequest); ; class Director:public Approver public: void ProcessRequest(PurchaseRequest aRequest) *此处代码省略* ; class President:public Approver public: void ProcessRequest(PurchaseRequest aRequest) *此处代码省略* ; class VicePresident:public Approver public: void ProcessRequest(PurchaseRequest aRequest *此处代码省略* ; void main() Congress Meeting; VicePresident Sam; Director Larry; President Tammy; 构造责任链 Meeting.SetSuccessor(NULL); Sam.SetSuccessor(______); Tammy.SetSuccessor(______); Larry.SetSuccessor(______); PurchaseRequest aRequest; 构造一采购审批请求 cin >> aRequest.Amount; 输入采购请求的金额 ______.ProcessRequest(aRequest); 开始审批 return;