问题描述:登山机器人是一个及富挑战性的高技术密集型科学研究项目,它为研究发展多智能体系统和多机器人之间的合作与对抗提供了生动的研究模型。
登山机器人可以携带有限的能量。在登山过程中,登山机器人需要消耗一定能量,连续攀登的路程越长,其攀登的速度就越慢。在对m种不同类型的机器人进行性能测试时,测定出每个机器人连续攀登1,2,…,n米所用的时间。现在要对这m个机器人进行综合性能测试,举行机器人接力连续攀登演习。攀登的总高度为s米。规定每个机器人攀登1次,每次至少攀登1米,最多攀登n米,而且每个机器人攀登的高度必须是整数,即只能在整米处接力。安排每个机器人攀登适当的高度,使完成接力攀登的时间最短。
设计要求:
给定m个登山机器人接力攀登的总高度s,以及每个机器人连续攀登1,2,…,n米所用的时间,计算最优攀登方案。
数据输入:
第1行是正整数m,n和s分别表示机器人的个数、每个机器人最多可以攀登的高度和接力攀登的总高度。接下来的m行中,每行有n个正整数,分别表示机器人连续攀登1,2,…,n米所用的时间。
数据输出:
输出登山机器人接力到达终点的最短攀登时间。
输入样本:(input.txt)
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
分析:这个问题我们首先想到的是动态规划的策略来解决该问题,然而这里我采用贪吃算法来解决此问题,假设机器人每步走一米,我们进行一米一米的贪吃办法来算出机器人走过的米数,即步数。由于每个机器人都要走,所以我们先让每个机器人走一步,将问题缩小,再在剩下的数据里面选出走下一步用时最少的机器人,让它走一步,进一步缩小问题规模,依次循环直到走完所有的路程,即可求知各个机器人走的步子,即就是走过的路程,对应给出路程的各个机器人的时间叠加起来就得了最短的时间了。
程序黏贴:
package robot;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class RobotQuetion {
/**
* @param args
*/
int a[][], times[][];
int n, k, m, time = 0;
public static void main(String[] args) {
RobotQuetion robot = new RobotQuetion();
robot.init();
robot.step1();
robot.stepOthers();
robot.minTime();
robot.saveStep();
System.out.println(robot.getTime());
}
void init() {// 初始化文件数字及存储空间
File file = new File("input.txt");
FileReader rd = null;
try {
rd = new FileReader(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
BufferedReader buf = new BufferedReader(rd);
String str = "";
try {
str = buf.readLine();
} catch (IOException e) {
e.printStackTrace();
}
String[] b = str.split(" ");
n = Integer.parseInt(b[0]);
k = Integer.parseInt(b[1]);
m = Integer.parseInt(b[2]);
times = new int[n][];
a = new int[n][];
System.out.println(n + " " + k + " " + m);
for (int i = 0; i < n; i++) {
try {
str = buf.readLine();
} catch (IOException e) {
e.printStackTrace();
}
b = str.split(" ");
times[i] = new int[k + 1];
a = new int[n][2];
for (int j = 1; j <= k; j++) {
times[i][j] = Integer.parseInt(b[j - 1]);
System.out.print(times[i][j] + " ");
}
System.out.println();
}
try {
if (buf.ready())
buf.close();
if (rd.ready())
rd.close();
} catch (IOException e) {
e.printStackTrace();
}
}
void step1() {// 让每个机器人先走一步
for (int i = 0; i < n; i++) {
a[i][0] = times[i][2] - times[i][1];
a[i][1] = 1;
}
}
void stepOthers() {
int flag;
int min;// 最小时间
m -= n;// 已经走了n米
while (m-- > 0) {
min = a[0][0];
flag = 0;
int i;
for (i = 0; i < n; i++)
if (a[i][0] < min && a[i][1] < k) {
min = a[i][0];
flag = i;
}
a[flag][1]++;// 当前机器人向前走一步
if (a[flag][1] < k)
a[flag][0] = times[flag][a[flag][1] + 1]
- times[flag][a[flag][1]];
else
a[flag][0] = 100000000;
}
}
void minTime() {
for (int i = 0; i < n; i++) {
time += times[i][a[i][1]];
System.out.println(a[i][1] + " " + time);
}
}
public int getTime() {
return time;
}
void saveStep() {// 写入到文件
File file = new File("output.txt");
if (!file.exists())
try {
file.createNewFile();
} catch (IOException e1) {
e1.printStackTrace();
}
FileWriter wr = null;
try {
wr = new FileWriter(file);
} catch (IOException e) {
e.printStackTrace();
}
PrintWriter Pw = new PrintWriter(wr, true);
for (int i = 0; i < n; i++) {
Pw.println("第" + (i + 1) + "个机器人走" + a[i][1] + "步 ");
}
Pw.println("总共需要" + getTime() + "单位时间");
}
}
分享到:
相关推荐
人工智能机器人alice的java版源代码Alice人工智能机器人alice的java版源代码Alice
《卡雷尔机器人学Java中文版》是一本深受学习者喜爱的编程入门教材,尤其适合初学者使用。这本书源于斯坦福大学的公开课——CS106A课程,它旨在教授编程的基本概念和方法,帮助读者建立起对编程语言的深刻理解和实践...
【Java版微信机器人】是一种基于网页版微信协议的自动化工具,它使用Java编程语言实现,允许用户通过编写代码来控制微信账号,实现自动化的消息处理、聊天交互等功能。开源的本质使得开发者可以自由地查看源码,理解...
卡雷尔机器人学Java
"根据网上aiml机器人开发的资料,整合的一个问答机器人demo,已解决中文支持问题,基于java开发,并附送2个文档" —— 描述进一步解释了项目的来源和特点。开发者参考了网上的AIML机器人开发资源,创建了一个具有...
【Java开发之京东客服机器人】项目是一个面向初学者的教程,旨在帮助理解如何构建一个简单的智能客服系统。这个项目利用了Java和JavaScript(JS)这两种技术,提供了完整的源码供学习者参考。在这个项目中,我们可以...
4.参数使用的是JSONObject,防止在用字符串拼接参数时出现各种特殊字符转义问题; 5.发送图片大小不超过2M(企业微信的规定)。 具体使用步骤见博客:...
《卡雷尔机器人学JAVA(KAREL THE ROBOT LEARNS JAVA)可复制》是一部专为初学者设计的编程教程,旨在通过一个名为“卡雷尔”的虚拟机器人的编程实践,帮助读者轻松掌握Java语言的基础知识。在这个过程中,读者不仅...
1. 主要包含3个java文件Robot.java, TextMessage.java, Utils.java 2. 网上拷贝可用的代码,只需更改机器人地址即可. 3. 包含httpclient jar包,fastjson jar包等.
网络机器人 java编程指南 用java实现网络机器人、自动执行复杂的Web交互
本文提出了基于机器人项目的Java编程实训教学模式的研究与实践,旨在解决当前Java编程实训教学中存在的问题,培养软件技术专业的创新人才,满足市场对软件技术人才的需求。 知识点: 1.基于机器人项目的Java编程实...
总的来说,"Java LEGO 机器人 编程教程 英文版"是一份极好的资源,它可以帮助你进入机器人技术与软件开发的交叉领域,无论是为了学术研究还是个人兴趣,都将是一次富有挑战性和趣味性的学习旅程。通过深入学习,你将...
通过《卡雷l雷尔机器人学JAVA》的学习,读者不仅能够掌握JAVA编程语言的基本技能,还能培养解决问题、逻辑思维和调试能力,为将来更深入的JAVA开发打下坚实基础。这本书以一种趣味性的方式将理论知识与实践相结合,...
【Java虚拟网络机器人】是一种基于Java编程语言的自动化程序,它能够模拟人类在网络上的行为,如浏览网页、填写表单、点击链接等。在互联网应用日益广泛的今天,这类机器人常用于数据抓取、自动化测试、在线客服等...
(免费版)卡雷尔机器人是斯坦福大学的一位学生rich与上世纪70年代设计的,是一个帮助入门者熟悉编程和工程学思想的入门环境。在90年代的时候卡雷尔机器人曾经被放弃。但是现在,斯坦福又开始使用新的卡雷尔机器人,...
Java智能语音机器人是一种利用Java编程语言,结合外部的AI服务,如图灵Robot和百度语音SDK,构建的交互式对话系统。这样的机器人可以为用户提供自然语言处理的能力,使其能够理解和回应人类的语言输入,从而实现智能...
"java语言开发的web版微信机器人 wxbotjava" 这个标签进一步确认了项目的核心特性:它是用Java编写的,并且专为微信设计。"wxbotjava"可能是项目内部的命名约定,用于标识与微信机器人相关的Java代码。 【压缩包子...
微信群机器人源码是一种基于Java编程语言开发的智能应用程序,它主要设计用于微信平台,实现自动回复、群管理以及群聊中的交互功能。这种机器人能够帮助用户高效地管理和维护微信群组,提升群内的互动性和智能化水平...
《网络机器人Java编程指南》是一本专注于教读者如何利用Java语言进行网络爬虫开发的教程。网络机器人,也称为网络爬虫或Web抓取程序,是自动浏览互联网并收集信息的程序。在Java中实现这样的功能,需要掌握一系列的...