算法设计与分析: 4-27 登山机器人问题

这篇博客探讨了登山机器人问题,这是一个涉及多机器人协作的高性能测试模型。文章介绍了如何利用贪心算法来确定最优的机器人接力攀登策略,以在攀登总高度m米时达到最短时间。输入包括机器人数量n、最大攀登高度k和总高度m,以及每个机器人在不同高度上的攀登时间。通过Java编程实现,输出最优攀登方案。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值