扔鸡蛋问题

现有2个鸡蛋,楼高100层,假设从n层楼及以上扔下会摔碎,n层以下不会,那么怎样扔能以最小的次数得到n?


不懂以后再理解吧。智商题


//两种思路解决问题

动态规划:根据每个鸡蛋从每层楼扔下的关系正常思维递推

i是鸡蛋 j是楼层

dp[i][j]=min{ max ( dp[i-1][j-1] + 1, cnt[i][j-p] + 1) ,for k = 1,2,……p}

import java.util.Scanner;

public class Main { 
	
    public static void main(String[] args) {
    	Scanner input = new Scanner(System.in);
    	
    	int num = input.nextInt();
    	
    	System.out.println(testEgg(3,num));
    	
    	
    	
    }
    
    
    static int testEgg(int egg,int leve){
    	//[鸡蛋][楼层]
    	int[][] dp = new int[egg+1][leve+1];
    	
    	//一个鸡蛋,测试有几个楼层就得测试几次
    	//0个鸡蛋,不使用,所以都默认设置成0
    	for(int i=0;i<leve+1;i++){
    		dp[0][i] = 0;
    		dp[1][i] = i;
    	}
    	
    	//所有的鸡蛋
    	//他们在 测试 0层楼只需要0次
    	//他测试一层楼必须扔一次
    	for(int i=2;i<egg+1;i++){
    		dp[i][0] = 0;
    		dp[i][1] = 1;
    	}
    	
    	
    	
    	for(int i=2;i<egg+1;i++){//鸡蛋数量
    		for(int j= 2;j<leve+1;j++){//楼层数量
    			
    			int min = Integer.MAX_VALUE;//计算 i 个蛋 最多得扔多少次 j层
    			//这一层循环,跟暴力没啥区别
    			// k -j 层楼 比较下 ,从那层楼开始扔鸡蛋,需要的次数最少
    			for(int k=1;k<j;k++){
    				
    				//任意一层扔下鸡蛋
    				//鸡蛋坏了,就剩下 i-1个鸡蛋,变成了 楼层-1 鸡蛋-1 的最佳扔鸡蛋策略
    				//鸡蛋没坏 这里一共是 j层楼  需要计算的就是 j-k 减去我派出掉的楼层剩余楼层的扔鸡蛋最佳策略
    				//。。因为我们的运气在系统设定下是最差的
    				//所以第 k  层扔鸡蛋  ,需要的次数肯定是 鸡蛋坏了 和鸡蛋没坏 最大次数
    				int max = (int)Math.max(dp[i-1][k-1],dp[i][j-k]);
    				
    				
    				//循环,找出 k - j 层那一层扔鸡蛋能得到的测试次数最少
    				min = Math.min(min,max);
    			}
    			dp[i][j] = min+1;
    		}
    	}
    	return dp[egg][leve];
    }
    
  
   
    
} 


换思路思考:

一个鸡蛋让你扔15次,保证测出鸡蛋质量,你最多能扔多少层楼

import java.util.Scanner;  
import java.util.ArrayList;  
import java.util.Queue;  
import java.util.LinkedList;  
public class B {  
	
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int level = input.nextInt();
		
		System.out.println(testLevel(3,level));
	}
	
	
	
	static int testLevel(int phone,int level){
		int times = 1;
		while(testTimes(phone,times)<level){
			times++;
		}
		
		return times;
	}
	
	static int testTimes(int phone,int times){
		if(phone==1)return times;
		
		if(phone>=times){
			return (int)Math.pow(2,times)-1;
		}
		
		return testTimes(phone-1,times-1) + testTimes(phone,times-1) +1;
	}
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SUNbrightness

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值