Java学习笔记——山西煤老板蛋疼的拉车问题
小荷才露尖尖角,早有蜻蜓立上头
——小池
这个问题是这样描述的:
山西煤老板有3000吨煤,要运到1000km公里外的地方卖。他选择使用火车来运煤,每辆火车行驶一公里将消耗一吨煤,且火车载货上限为1000吨。
山西煤老板是个懂代码的家伙,你觉得它最多能拉多少煤过去?
且不论懂代码的人为什么要选择这么蛋疼的方式拉煤。。算了,直接把它抽象成数学问题。
山西煤老板的煤总量为amount,总里程为totalTrail,火车载重为load
这类问题存在隐藏条件:
1、假设每辆车都能装满货物,那么amount一定是load的整数倍。(因为这样可以最大化送达货物)
2、载物工具一定是每走一步消耗一个物品。(因为系数为1最简单,但是其实这个系数是灵活的,而且并不麻烦。)
这道题举的例子比较简单,心算也是无压力的,主要讲讲思路。
3000t煤先用3辆车拉满,行至1000/3(km)处,三辆车一共损失了负载1000t煤,停车,把剩下的2000t煤装到2辆车里拉,再往前行驶1000/2(km),又损失了1000t煤。最后1车拉走这1000t煤。
∴amount = 1000-1000(1-1/2-1/3)=833.3t煤
代码用递归来实现,解出两个出口:
1、递归...最后一趟车了,拉完,结束
2、递归...最后几辆车了,拉完,结束
package cn.train;
public class Train {
public static void main(String[] args) {
int huoWu = ;
int load = ;
double totaltrail = ;
huoWu = calculate(huoWu, load, 0.0, totaltrail);
System.out.println("剩余货物为" + huoWu);
}
public static int calculate (int huoWu,int load,double trail,double totaltrail){
int quantity = huoWu/load;//计算车数
//不到最后一车就拉完了
if (totaltrail-trail < load/quantity) {
huoWu -= quantity*(totaltrail-trail);
return huoWu;
}
//最后一车了
if (huoWu == load) {
huoWu -= (int)(totaltrail - trail);
return huoWu;
}
trail += load/quantity;//开始走了
huoWu -= load;
return calculate(huoWu, load, trail, totaltrail);
}
}
Java学习笔记——山西煤老板蛋疼的拉车问题的更多相关文章
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
- 0035 Java学习笔记-注解
什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...
- Java学习笔记(04)
Java学习笔记(04) 如有不对或不足的地方,请给出建议,谢谢! 一.对象 面向对象的核心:找合适的对象做合适的事情 面向对象的编程思想:尽可能的用计算机语言来描述现实生活中的事物 面向对象:侧重于 ...
- 0032 Java学习笔记-类加载机制-初步
JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...
- 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用
垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
- 0025 Java学习笔记-面向对象-final修饰符、不可变类
final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- Java学习笔记-多线程-创建线程的方式
创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...
随机推荐
- Spark技术在京东智能供应链预测的应用
1 背景 前段时间京东公开了面向第二个十二年的战略规划,表示京东将全面走向技术化,大力发展人工智能和机器人自动化技术,将过去传统方式构筑的优势全面升级.京东Y事业部顺势成立,该事业部将以服务泛零售为核 ...
- 机器学习:Python实现lms中的学习率的退火算法
''' 算法:lms学习率的退火算法 解决的问题:学习率不变化,收敛速度较慢的情况 思路:由初始解和控制参数初值开始,对当前解重复进行"产生新解-->计算目标函数差--> 接受或 ...
- JS中遍历语法的比较
for循环 JavaScript 提供多种遍历语法.最原始的写法就是for循环.(假设myArray是数组,下面同理) let arr = [1,2,3,4,5]; for (var index = ...
- 图的基本算法(BFS和DFS)(转载)
图是一种灵活的数据结构,一般作为一种模型用来定义对象之间的关系或联系.对象由顶点(V)表示,而对象之间的关系或者关联则通过图的边(E)来表示. 图可以分为有向图和无向图,一般用G=(V,E)来表示图. ...
- Java Level 2 学习的八大名著
Java Level 2 学习的八大名著 前段时间有几天难得的假期,于是把自己认为Java技术栈中的精华总结了一下,但是一直没有时间写下来,今天终于得空希望本文可以对大家有所启发.通过多个实际项目的沉 ...
- 进入html+css世界的正确姿势
今天,我带大家一起走进html+css的世界. HTML其实是HyperText Markup Language的缩写, 超文本标记语言.他是用于告诉浏览器这是一个网页, 也就是说告诉浏览器我是一个H ...
- python css概述
1. 概述 css是英文Cascading Style Sheets的缩写,称为层叠样式表,用于对页面进行美化. 存在方式有三种:元素内联.页面嵌入和外部引入,比较三种方式的优缺点. 语法:style ...
- NodeJs之http
创建新的服务器 创建一个简单的服务 var http = require("http"); var server = http.createServer(); server.lis ...
- 聊聊 Tomcat 的单机多实例
Tomcat 从何而来? 先说 Tomcat 这一单词解释,如果你不是一个开发者,当然它在美国口语中并非是褒义词:如果你是开发者,那你一定听过 Web 应用服务器.Sun 公司和 Tomcat .如你 ...
- 深度理解 Virtual DOM
目录: 1 前言 2 技术发展史 3 Virtual DOM 算法 4 Virtual DOM 实现 5 Virtual DOM 树的差异(Diff算法) 6 结语 7 参考链接 1 前言 我会尽量把 ...