前几天看了李永乐老师的视频、忽然想写一下博客:
有i层楼,2个鸡蛋,鸡蛋是相同的,临界楼层是指从某个楼层之上抛下来,都会碎,但从这个楼层之下抛下来,都不会碎。没有碎的鸡蛋可以重复使用。试假设能找到这个临界楼层需要抛投的最少次数。
假设楼层i为100
第一个鸡蛋直接从楼层的一半扔下去:
假设第一个鸡蛋没碎:
第二个鸡蛋最坏的情况为1+(i/2-1-1)
假设第一个鸡蛋碎了
第二个鸡蛋最坏的情况还是1+(i/2-1-1)
最坏的情况下是49次
假设100层楼
第一个鸡蛋从10层楼扔下去
最坏的情况为 (i/10-1)+10-1 = 19次
文字表述:和=(首项 + 末项)x项数/2
数学表达:1+2+3+4+……+ n = (n+1)n /2
//使用循环求出次数
private static int layer; //楼层数量private static int egg; //鸡蛋数量private static int minNum; //最优解法:在layer层楼、egg个鸡蛋的时候,一定能找到临界楼层的最初抛投次数private static int maxInterval; //间隔的值之和:1、2、3、4的和小于楼层数量public static void main(String[] args) {layer = 200; //楼层数量赋值egg = 2; //鸡蛋数量赋值
// getMin();}private static int getMin(){int num = 1; //声明初始化间距为1minNum = recursionMin(num,layer);System.out.println(minNum);return minNum;}private static int recursionMin(int num,int layer){if (maxInterval < layer && maxInterval + 1 != layer) {//num每次从一开始加 maxInterval为最大值:如果楼层为100最大值为1、2、3、4。。。14的和num = num + 1;maxInterval += num;return recursionMin(num,layer);} else {return num;}}
//解高斯方程求出次数
public static void main(String[] args) {layer = 100; //楼层数量赋值egg = 2; //鸡蛋数量赋值getEquation(layer);}public static int getEquation(int layer){double n;//补了一下小学数学--!套入公式(n+1)*n/2 = layer然后解方程/** (x-a)(x-a) = 0* x*x -ax -ax + a*a = 0* x*x - 2ax + a*a = 0* 解方程步骤:* (n+1)*n = layer * 2* n*n + n = layer *2* n*n + 2*1/2*n + 1/2 * 1/2 = layer *2 + 1/2*1/2* (n+1/2)*(n+1/2) = layer *2 + 1/4* (n+1/2)*(n+1/2) = (layer * 2 * 4 + 1)/4* n + 1/2 = Math.sqrt((layer * 2 * 4 + 1)/4)* n = Math.sqrt((layer * 2 * 4 + 1)/4)) - 1/2* */int gen = layer*2+1/4;//1/2只会按整型运算,结果也是整形的所以==0 必须使用1.0/2.0n = il(Math.sqrt(gen) - 1.0/2.0);return 1;}
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class DuoDan {private static int layer; //楼层数量private static int egg; //鸡蛋数量private static int minNum; //最优解法:在layer层楼、egg个鸡蛋的时候,一定能找到临界楼层的最初抛投次数public static void main(String[] args) {layer = 30; //楼层数量赋值egg = 3; //鸡蛋数量赋值getMin();}private static int getMin() {recursionEgg(layer,egg);System.out.println(minNum);return minNum;}private static int recursionEgg(int layer,int egg){if(layer <= 0){//楼层数量小于0返回0return 0;}if(layer <= 1){//楼层数量小于1返回1return layer;}if(egg <= 1){//鸡蛋个数小于1返回剩余楼层数量return layer;}List<Integer> num = new ArrayList<Integer>();
// int i = 5;//第一次求第一次重第几层往下扔for (int i = 1;i<layer;i++){//求出从1-n层楼往下扔鸡蛋的每次需要的最多次数num.add(recursionMax(layer,egg,i));}minNum = Collections.min(num);//取出一个最小值return minNum;}private static int recursionMax(int layer,int egg,int k) {//k是当前从第几层楼开始扔if(k <= 0){//如果在第一层的话鸡蛋碎了会变成0 默认赋值1k = 1;}if(layer <= 0){//楼层数量小于0返回0return 0;}if(layer <= 1){//楼层数量小于1返回1return layer;}if(egg <= 1){//鸡蛋个数小于1返回剩余楼层数量return layer;}if (egg > 2) {//判断如果鸡蛋数量大于2的情况下循环递归调用// 没碎 碎了return Math.max(recursionEgg(layer-k,egg),recursionEgg(k-1,egg-1))+1;}
// //没碎 碎了
// //每扔一次数就加1、的出最坏情况下需要扔几次return Math.max(recursionMax(layer - k,egg,k-1),recursionMax(k-1,egg-1,k-1))+1;}}
本文发布于:2024-02-02 17:30:33,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170686623445345.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |