zoukankan      html  css  js  c++  java
  • 突击战

    突击战commando.pas

    【问题描述】

    你有n个部下,每个部下需要完成一项任务。第i个部下需要你花Bi分钟交代任务,然后他会立刻独立地,无间断的执行Ji分钟后完成任务。你需要交代任务的顺序,使得所有的任务尽早执行完毕。注意,不能同时给2个部下交代任务,但是部下可以同时执行各自的任务。

    【输入格式】commando.in

    输入数据包括多组数据,每组数据的第一行为部下的个数N(1≤N≤1000);以下N行有2个正整数B和J(1≤B≤1000,1≤J≤1000),即交代任务的时间和执行任务的时间。输入结束标志符为N=0。

    【输出格式】commando.out

    对于每组数据,输出(以第i组数据为例):

    Case i: Time

    【样例输入】

    3

    2 5

    3 2

    2 1

    3

    3 3

    4 4

    5 5

    0

    【样例输出】

    Case 1: 8

    Case 2: 15

    【问题分析】

    假定有2个人,布置任务的时间分别为a1,a2,执行任务的时间分别为b1,b2

    (1)先给第1个人布置任务花时间为a1,然后该人开始任务;

    (2)再给第2个人布置任务花时间为a2,当然在布置任务时第1个人是在执行任务的,当第2个任务布置完成后,第1个人的任务执行了a2时,还剩下(b1 – a2)的执行时间(当然这里假设b1>=a2的,否则还没等任务2布置完,任务1就执行完了),第2个人开始执行任务需要b2时间才能完成,若此时第1人的个任务还没完成的话,这里第1个人和第2个人可以同时去执行任务,这里需要的时间是多少呢?当然不是第1个人剩下完成的时间+第2个人完成任务的时间啦!因为他们是同时进行的,谁的时间长就是执行完任务所需要的时间。即为max(b1-a2, b2)

    所以总共需要的时间为:   a1 + a2 + max(b1 – a2, b2)-------à①

    以上是第1个人在安排在前面的,现在来看看,若要把第2个人安排在前面会怎么样呢?如上分析可得,所需要时间为:a2 + a1 + max(b2 – a1, b1)-------à②

    由① - ②得:max(b1 – a2, b2) - max(b2 – a1, b1)

    (1)若b2>b1,则显然有:

    max(b1 – a2, b2) = b2 > b2 – a1 è max(b1 – a2, b2) > max(b2 – a1, b1)

    (2)若b2<b1,则显然有:

    max(b2 – a1, b1) = b1 > b1 – a2 è max(b2 – a1, b1) > max(b1 – a2, b2)

    这样我们就得到一个结论,把执行任务时间长的安排在最前面,那总时间会最小。于是,我们只需要按执行任务的时间从大到小排序,总时间为所有的任务布置时间之和+最后一个任务布置完成后所有任务执行最长的那个。

    参考代码为:

    S := 0; t := 0;

    For I := 1 to n do begin

      Inc(s, a[i]);

      Dec(t, a[i]);

      If t < b[i] then t := b[i];

    End;

    Writeln(s + t);

  • 相关阅读:
    转: js中的getYear()函数的问题(推荐用 getFullYear())
    document.compatMode简介
    javascript的isPrototypeOf函数的理解
    javascript Error对象详解
    jQuery事件函数bind,live,delegate的区别
    js运算符(运算符的结合性)
    字符串的正则方法 数值的扩展
    字符串的扩展
    jsp 中href链接有前缀
    变量的结构赋值
  • 原文地址:https://www.cnblogs.com/ahmasoi/p/3472074.html
Copyright © 2011-2022 走看看