现有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;
}
}