1. 程式人生 > >演算法設計與分析: 4-27 登山機器人問題

演算法設計與分析: 4-27 登山機器人問題

4-27 登山機器人問題

問題描述

登山機器人是一個極富挑戰性的高技術密集型科學研究專案,它為研究發展多智慧體系統和多機器人之間的合作與對抗提供了生動的研究模型。 登山機器人可以攜帶有限的能量。在登山過程中,登山機器人需要消耗一定能量,連續攀登的路程越長,其攀登的速度就越慢。在對 n 種不同型別的機器人作效能測試時,測定 出每個機器人連續攀登 1 米,2 米,…,k 米,所用的時間。現在要對這 n 個機器人作綜合 效能測試,舉行機器人接力攀登演習。攀登的總高度為 m 米。規定每個機器人只能攀登 1 次,每次至少攀登 1 米,最多攀登 k 米,而且每個機器人攀登的高度必須是整數,即只能 在整米處接力。安排每個機器人攀登適當的高度,使完成接力攀登用的時間最短。

給定 n 個登山機器人接力攀登的總高度 m,及每個機器人連續攀登 1 米,2 米,…,k 米,所用的時間,程式設計計算最優攀登方案。

資料輸入:
第一行是正整數 n,k 和 m 分別表示機器人的個數,每 個機器人最多可以攀登的高度,和攀登的總高度。接下來的 n 行中,每行有 k 個正整數,分 別表示機器人連續攀登 1 米,2 米,…,k 米所用的時間。

Java

import java.util.Scanner;

public class DengShanJiQiRen {

    private static int[][] a,b;
    private static
int[] w; private static int n,k,m; private static int MAX = 1000000; public static void main(String[] args){ Scanner input = new Scanner(System.in); while (true){ n = input.nextInt(); k = input.nextInt(); m = input.nextInt(); a = new
int[n+1][k+1]; b = new int[n+1][k+1]; w = new int[n+1]; for(int i=1; i<=n; i++) for(int j=1; j<=k; j++) a[i][j] = input.nextInt(); int result = compute(); System.out.println(result); } } private static int compute(){ int i,j,min,h=1,sum=0; for(i=1;i<=n;i++) for(j=1;j<k;j++) b[i][j]=a[i][j+1]-a[i][j]; for(i=1;i<=n;i++) b[i][k]=MAX; for(i=1;i<=n;i++) w[i]=1; for(i=n+1;i<=m;i++){ min=b[1][w[1]]; for(j=1;j<=n;j++) if(b[j][w[j]]<=min){ min=b[j][w[j]]; h=j; } w[h]++; } for(i=1;i<=n;i++) sum+=a[i][w[i]]; return sum; } }

Input & Output

5 10 25 
24 49 75 102 130 160 192 230 270 320 
23 48 75 103 139 181 224 274 344 415 
22 49 80 180 280 380 480 580 680 780 
25 51 80 120 170 220 270 320 370 420 
23 49 79 118 158 200 250 300 350 400
727

Reference

王曉東《計算機演算法設計與分析》(第3版)P137