3-19 最优时间表问题
问题描述
一台精密仪器的工作时间为 n 个时间单位。与仪器工作时间同步进行若干仪器维修程序。一旦启动维修程序,仪器必须进入维修程序。如果只有一个维修程序启动,则必须进入 该维修程序。如果在同一时刻有多个维修程序,可任选进入其中的一个维修程序。维修程序 必须从头开始,不能从中间插入。一个维修程序从第 s 个时间单位开始,持续 t 个时间单位, 则该维修程序在第 s+t-1 个时间单位结束。为了提高仪器使用率,希望安排尽可能少的维修 时间。
对于给定的维修程序时间表,编程计算最优时间表。
数据输入:
第 1 行有 2 个正整数 n 和 k。n 表示仪器的工作时间单位;k 是维修程序数。接下来的 k 行中,每行有 2 个表示维修程序的整数 s 和 t,该维修程序从第 s 个时间单位开始,持续 t 个时间单位。
Java
import java.util.Scanner;
public class ZuiYouShiJianBiao {
private static int[] mt;
private static int[] s,t;
private static int n,k;
private static int MAX = 100000;
public static void main(String[] args){
Scanner input = new Scanner(System.in);
while (true){
n = input.nextInt();
k = input.nextInt();
mt = new int[n+2];
s = new int[k+1];
t = new int[k+1];
for(int i=1; i<=k; i++){
s[i] = input.nextInt();
t[i] = input.nextInt();
}
mt[n+1] = n;
for(int i=1; i<=n; i++)
mt[i] = MAX;
dynamic();
System.out.println(mt[1]);
}
}
private static void dynamic(){
for(int i=n; i>0; i--){
int count = 0;
for(int j=1; j<=k; j++){
if(s[j] == i){
count++;
int temp = mt[i+t[j]];
if(mt[i] > temp)
mt[i] = temp;
}
}
if(count == 0)
mt[i] = mt[i+1]-1;
}
}
}
Input & Output
15 6
1 2
1 6
4 11
8 5
8 1
11 5
11
20 7
2 10
2 2
5 6
5 5
11 5
11 2
14 4
12
Reference
王晓东《计算机算法设计与分析》(第3版)P96