Java实现 泊松分酒
泊松是法国数学家、物理学家和力学家。他一生致力科学事业,成果颇多。有许多著名的公式定理以他的名字命名,比如概率论中著名的泊松分布。
有一次闲暇时,他提出过一个有趣的问题,后称为:“泊松分酒”。在我国古代也提出过类似问题,遗憾的是没有进行彻底探索,其中流传较多是:“韩信走马分油”问题。
有3个容器,容量分别为12升,8升,5升。其中12升中装满油,另外两个空着。要求你只用3个容器操作,最后使得某个容器中正好有6升油。
下面的列表是可能的操作状态记录:
12,0,0
4,8,0
4,3,5
9,3,0
9,0,3
1,8,3
1,6,5
每行3个数据,分别表示12,8,6升容器中的油量
第一行表示初始状态,第二行表示把12升倒入8升容器后的状态,第三行是8升倒入5升,…
当然,同一个题目可能有多种不同的正确操作步骤。
本题目的要求是,请你编写程序,由用户输入:各个容器的容量,开始的状态,和要求的目标油量,程序则通过计算输出一种实现的步骤(不需要找到所有可能的方法)。如果没有可能实现,则输出:“不可能”。
例如,用户输入:
12,8,5,12,0,0,6
用户输入的前三个数是容器容量(由大到小),接下来三个数是三个容器开始时的油量配置,最后一个数是要求得到的油量(放在哪个容器里得到都可以)
则程序可以输出(答案不唯一,只验证操作可行性):
12,0,0
4,8,0
4,3,5
9,3,0
9,0,3
1,8,3
1,6,5
每一行表示一个操作过程中的油量状态。
注意:
请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static ArrayList<String> set = new ArrayList<String>();
public static int[] maxN = new int[3];
public static int[] N = new int[3];
public static int ans;
public static int count = 0;
//某start瓶向end瓶中倒
public void getOnetoAnother(int start, int end) {
if(N[start] == 0)
return;
if(maxN[end] > N[end]) {
int low = maxN[end] - N[end];
int temp1 = N[start], temp2 = N[end];
if(low >= N[start]) {
N[end] = N[end] + N[start];
N[start] = 0;
} else {
N[end] = maxN[end];
N[start] = N[start] - low;
}
StringBuffer s = new StringBuffer("");
s.append(N[0]);
s.append(",");
s.append(N[1]);
s.append(",");
s.append(N[2]);
if(!set.contains(s.toString())) {
set.add(s.toString());
count++;
} else {
N[start] = temp1;
N[end] = temp2;
}
}
}
public boolean check() {
if(N[0] == ans || N[1] == ans || N[2] == ans) {
for(String s : set)
System.out.println(s);
return true;
}
return false;
}
public void getResult() {
int max = Math.max(maxN[0], Math.max(maxN[1], maxN[2]));
if(ans > max) {
System.out.println("不可能");
return;
}
while(true) {
int temp = count;
//A瓶向B瓶倒
getOnetoAnother(0, 1);
if(check())
break;
//B瓶向C瓶倒
getOnetoAnother(1, 2);
if(check())
break;
//C瓶向A瓶倒
getOnetoAnother(2, 0);
if(check())
break;
//A瓶向C瓶倒
getOnetoAnother(0, 2);
if(check())
break;
//C瓶向B瓶倒
getOnetoAnother(2, 1);
if(check())
break;
//B瓶向A瓶倒
getOnetoAnother(1, 0);
if(check())
break;
temp = count - temp;
if(temp == 0) {
System.out.println("不可能");
return;
}
}
}
public static void main(String[] args) {
Main test = new Main();
Scanner in = new Scanner(System.in);
String S = in.next();
String[] arrayS = S.split(",");
for(int i = 0;i < 3;i++)
maxN[i] = Integer.valueOf(arrayS[i]);
for(int i = 3;i < 6;i++)
N[i - 3] = Integer.valueOf(arrayS[i]);
ans = Integer.valueOf(arrayS[6]);
StringBuffer s = new StringBuffer("");
s.append(N[0]);
s.append(",");
s.append(N[1]);
s.append(",");
s.append(N[2]);
set.add(s.toString());
test.getResult();
}
}
运行结果:
测试用例1:
12,8,5,12,0,0,6
12,0,0
4,8,0
4,3,5
9,3,0
9,0,3
7,0,5
7,5,0
2,5,5
2,8,2
10,0,2
10,2,0
5,2,5
5,7,0
0,7,5
0,8,4
8,0,4
8,4,0
3,4,5
3,8,1
11,0,1
11,1,0
6,1,5
测试用例2:
30,13,7,30,0,0,5
30,0,0
17,13,0
17,6,7
24,6,0
24,0,6
23,0,7
23,7,0
16,7,7
16,13,1
29,0,1
29,1,0
22,1,7
22,8,0
15,8,7
15,13,2
28,0,2
28,2,0
21,2,7
21,9,0
14,9,7
14,13,3
27,0,3
27,3,0
20,3,7
20,10,0
13,10,7
13,13,4
26,0,4
26,4,0
19,4,7
19,11,0
12,11,7
12,13,5
测试用例3:
31,19,11,31,0,0,5
31,0,0
12,19,0
12,8,11
23,8,0
23,0,8
20,0,11
20,11,0
9,11,11
9,19,3
28,0,3
28,3,0
17,3,11
17,14,0
6,14,11
6,19,6
25,0,6
25,6,0
14,6,11
14,17,0
3,17,11
3,19,9
22,0,9
22,9,0
11,9,11
11,19,1
30,0,1
30,1,0
19,1,11
19,12,0
8,12,11
8,19,4
27,0,4
27,4,0
16,4,11
16,15,0
5,15,11
测试用例4:
65,33,12,65,0,0,18
65,0,0
32,33,0
32,21,12
44,21,0
44,9,12
56,9,0
56,0,9
53,0,12
53,12,0
41,12,12
41,24,0
29,24,12
29,33,3
62,0,3
62,3,0
50,3,12
50,15,0
38,15,12
38,27,0
26,27,12
26,33,6
59,0,6
59,6,0
47,6,12
47,18,0
Java实现 泊松分酒的更多相关文章
- 算法笔记_219:泊松分酒(Java)
目录 1 问题描述 2 解决方案 1 问题描述 泊松是法国数学家.物理学家和力学家.他一生致力科学事业,成果颇多.有许多著名的公式定理以他的名字命名,比如概率论中著名的泊松分布. 有一次闲暇时,他 ...
- PAT(B) 1018 锤子剪刀布(C:20分,Java:18分)
题目链接:1018 锤子剪刀布 分析 用一个二维数组保存两人所有回合的手势 甲乙的胜,平,负的次数刚好相反,用3个变量表示就可以 手势单独保存在signs[3]中,注意顺序.题目原文:如果解不唯一,则 ...
- Java web--Filter过滤器分IP统计访问次数
分IP统计访问次数即网站统计每个IP地址访问本网站的次数. 分析 因为一个网站可能有多个页面,无论哪个页面被访问,都要统计访问次数,所以使用过滤器最为方便. 因为需要分IP统计,所以可以在过滤器中创建 ...
- Java中的分代垃圾回收策略
一.分代GC的理论基础 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大 ...
- 分酒问题(DFS解法)
题目大概是这样: 已知有三个容量分别为3千克.5千克和8千克的并且是没有刻度的酒瓶,3千克和5千克的瓶子均装满了酒,而8千克的瓶子为空.现要求仅用这三个酒瓶将这些酒均分为两个4千克并分别装入5千克和8 ...
- 浅谈Java堆内存分代回收
目录 1.概述 2.堆内存是如何分代的 3.各分代之间是如何配合工作的 1.概述 与C++不同的是, 在Java中我们无需关心对象占用空间的释放, 这主要得益于Java中的垃圾处理器(简称GC)帮助我 ...
- 四、Java web 部 分试题
1 .Tomcat 的 优 化 经 验 答:去掉对 web.xml 的监视,把 jsp 提前编辑成 Servlet. 有富余物理内存的情况,加大 tomcat 使用的 jvm 的内存 2 .HTTP ...
- CCF201703-1 分蛋糕 java(100分)
试题编号: 201703-1 试题名称: 分蛋糕 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别 ...
- Java 微信支付分对接记录 (先享后付)
微信支付分(先享后付)对接记录: 微信支付分对接步骤 填写开通支付分的申请表格 此步骤大概需要审核 1-3 个工作日; (模板-服务信息配置表-[先享后付免确认]-[商户名].xls) 填写商户信息 ...
随机推荐
- Apache Poi实现excel解析
一.说明 1.本文通过使用 poi 工具解析 excel 表格数据,实现导入导出 2.excel目前有两种格式 2003版本的 excel.xls 与 2007版本的 excel.xlsx ,注意两种 ...
- 可能会导致.NET内存泄露的8种行为
原文连接:https://michaelscodingspot.com/ways-to-cause-memory-leaks-in-dotnet/作者 Michael Shpilt.授权翻译,转载请保 ...
- Android平台使用termux,随时随地写代码
生活如此无聊,写点代码打发时间. 趁着假期,我的vivo手机和华为平板(均为4G+64G配置)用的也比较少.于是,思考着如何将这2个设备用来写latex.python.用kingroot却取不了两设备 ...
- async/await的语法和使用
1. async 函数 (1)函数的返回值为promise对象 (2)promise对象的结果由async函数执行的返回值决定 2. await 表达式 (1)await右侧的 ...
- 微信小程序中,如何阻止多次点击单击事件
在微信小程序中,有自制对话框用于提交数据,但是会出现用户连续点击,多次提交数据的情况. //.wxml <view class="acertain" bindtap=&quo ...
- County Fair Events
先按照结束时间进行排序,取第一个节日的结束时间作为当前时间,然后从第二个节日开始搜索,如果下一个节日的开始时间大于当前的时间,那么就参加这个节日,并更新当前时间 #include <bits/s ...
- 汉语拼音转换工具包pypinyin
#pip install pypinyin汉字转换汉语拼音 from pypinyin import lazy_pinyin,TONE,TONE2,TONE3 str="你知道我是谁吗?&q ...
- [前端进阶课] 构建自己的 webpack 知识体系
webpack webpack 最出色的功能之一就是,除了 JavaScript,还可以通过 loader 引入任何其他类型的文件. Webpack 核心概念: Entry(入口):Webpack 执 ...
- charme浏览器 jquery1.9.1min.js 报脚本错误 无jquery.min.map 文件
http://www.vipaq.com/Article/View/blog/357.html /*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation ...
- poj2391 最大流+拆点+二分答案+Floyd
Ombrophobic Bovines Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19553 Accepted: 4 ...