[蓝桥杯][java]海盗分酒
来源:互联网 发布:深圳哪里有淘宝拍摄的 编辑:程序博客网 时间:2024/04/27 20:20
/*
* 有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复......
* 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。
等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”
请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。
如果有多个可能的答案,请列出所有答案,每个答案占一行。
格式是:人数,人数,...
例如,有一种可能是:20,5,4,2,0
答案写在“解答.txt”中,不要写在这里!
[解题思路]
此题有如下几个特点:
1. 次数是固定的,总共有4次
2. 最后一轮的人(包括海盗船长的饮酒量是确定的,就是一瓶)
3. 每次都是一瓶酒平分,每次饮酒的人,包括海盗船长,的饮酒量都是1/当前轮次中的总人数
4. 初始人数不确定,仅知道不可能多于20人
本题最适合采用逆向的递归来实现
1. 设置一个数组,下标从0开始,其中的每个元素的内容表示每轮的人数
2. 初始值为0,保存在下标为0的元素中.
3. 由后向前逆推,每欠尝试上一轮的人数,尝试时有这样的一些准则:
1) 上一轮的人数必须比本轮的人数多
2) 上一轮人数不可能多于20人
4. 递归结束的条件:
1)到达了下标为4的元素
2)当前元素中的值不大于20
3)数组中前5位值的总和为1
5. 递归递进的条件
1) 当前的下标不为4
[解题流程]
1. 接受当前的人数数组
2. 接受当前的下标值
3. 接受起始的人数值
4. 从当前起始的人数值开始计算,循环尝试到20
每取一个值时,判断当前下标是否达到了4
是: 判断数组中表示的总的饮酒量是否为1
是: 输出结果
否: 调用自身,再次尝试下一步操作
[运行结果]
* */
public class WineCaption {
public static int[] wineLoop = new int[5];
public static void printWineProc(int[] wineLoop){
for(int i=wineLoop.length-1; i>=0; i--)
{
System.out.print(wineLoop[i]);
if(i>0)
System.out.print(',');
}
System.out.println();
}
public static boolean calcTotalWine(int[] wineLoop){
int totalFenZi = 0;
int totalFenMu = 0;
totalFenMu = wineLoop[1]*wineLoop[2]*wineLoop[3]*wineLoop[4];
totalFenZi = totalFenMu / wineLoop[1] + totalFenMu / wineLoop[2] + totalFenMu / wineLoop[3] + totalFenMu / wineLoop[4];
return totalFenMu == totalFenZi;
}
public static void drink(int[] wineLoop, int xb, int startNumber){
for(int i=startNumber; i<=20; i++){
wineLoop[xb] = i;
if(xb==4)
{
if(calcTotalWine(wineLoop))
printWineProc(wineLoop);
}
else
drink(wineLoop,xb+1,i+1);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i=0; i<5; i++)
wineLoop[i]=0;
drink(wineLoop,1,1);
}
}
* 有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复......
* 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。
等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”
请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。
如果有多个可能的答案,请列出所有答案,每个答案占一行。
格式是:人数,人数,...
例如,有一种可能是:20,5,4,2,0
答案写在“解答.txt”中,不要写在这里!
[解题思路]
此题有如下几个特点:
1. 次数是固定的,总共有4次
2. 最后一轮的人(包括海盗船长的饮酒量是确定的,就是一瓶)
3. 每次都是一瓶酒平分,每次饮酒的人,包括海盗船长,的饮酒量都是1/当前轮次中的总人数
4. 初始人数不确定,仅知道不可能多于20人
本题最适合采用逆向的递归来实现
1. 设置一个数组,下标从0开始,其中的每个元素的内容表示每轮的人数
2. 初始值为0,保存在下标为0的元素中.
3. 由后向前逆推,每欠尝试上一轮的人数,尝试时有这样的一些准则:
1) 上一轮的人数必须比本轮的人数多
2) 上一轮人数不可能多于20人
4. 递归结束的条件:
1)到达了下标为4的元素
2)当前元素中的值不大于20
3)数组中前5位值的总和为1
5. 递归递进的条件
1) 当前的下标不为4
[解题流程]
1. 接受当前的人数数组
2. 接受当前的下标值
3. 接受起始的人数值
4. 从当前起始的人数值开始计算,循环尝试到20
每取一个值时,判断当前下标是否达到了4
是: 判断数组中表示的总的饮酒量是否为1
是: 输出结果
否: 调用自身,再次尝试下一步操作
[运行结果]
* */
public class WineCaption {
public static int[] wineLoop = new int[5];
public static void printWineProc(int[] wineLoop){
for(int i=wineLoop.length-1; i>=0; i--)
{
System.out.print(wineLoop[i]);
if(i>0)
System.out.print(',');
}
System.out.println();
}
public static boolean calcTotalWine(int[] wineLoop){
int totalFenZi = 0;
int totalFenMu = 0;
totalFenMu = wineLoop[1]*wineLoop[2]*wineLoop[3]*wineLoop[4];
totalFenZi = totalFenMu / wineLoop[1] + totalFenMu / wineLoop[2] + totalFenMu / wineLoop[3] + totalFenMu / wineLoop[4];
return totalFenMu == totalFenZi;
}
public static void drink(int[] wineLoop, int xb, int startNumber){
for(int i=startNumber; i<=20; i++){
wineLoop[xb] = i;
if(xb==4)
{
if(calcTotalWine(wineLoop))
printWineProc(wineLoop);
}
else
drink(wineLoop,xb+1,i+1);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i=0; i<5; i++)
wineLoop[i]=0;
drink(wineLoop,1,1);
}
}
0 0
- [蓝桥杯][java]海盗分酒
- 蓝桥杯 海盗分金币
- 蓝桥杯 海盗分金币
- 海盗分酒(数学问题)
- 蓝桥杯 2014 1 海盗分金币
- 海盗分金块问题
- 海盗分金问题
- 海盗分金币
- 海盗分金币
- 海盗分金问题
- 海盗分金
- [数学]海盗分金块
- 海盗分金子
- 海盗分金
- 海盗分宝问题
- 海盗分金1
- 海盗分金2
- “海盗分金”问题
- git的学习
- mongodb数据存储大小
- 十一月总结
- HDU1224_Free DIY Tour【DP】【回溯】
- B树、B-tree B+树、B*树
- [蓝桥杯][java]海盗分酒
- iOS申请发布证书-图文详解
- 第六章 图
- 第12周项目 3.5 二进制
- 2.5SpringMVC小例子
- 日语学习之沪江N4基础 20141201 -7
- How to view Shelved P4 Changes?
- iphone Dates
- Pascal's Triangle II