AcWing 3171. 耐摔指数
原题链接
中等
作者:
j简单
,
2021-04-16 23:11:53
,
所有人可见
,
阅读 435
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
int N = reader.nextInt();
int f1[]=new int [N+1];//f1[i]表示1台手机 在楼层总高度为i的最坏测试次数
int f2[]=new int [N+1];
int f3[]=new int [N+1];
//一部手机时
//枚举楼层i, f1[i] = i
for(int i = 1; i <= N; i ++)
f1[i] = i;
//两部手机时
//枚举楼层总高度
for(int i = 1; i <= N; i ++ ){
//枚举开始测试楼层高度
int ans = 1005;
for(int j = 1; j <= i; j ++){
/**
*从第j层摔下,有两种结果:
* 1、碎了,则测试次数为 f1[j - 1] + 1
* 2、没碎,则测试次数为 f2[i - j] + 1
* 两者取一个max则为两台手机在楼层总高度为i时
* 开始测试楼层高度为j的最坏测试次数
*/
int res = Math.max(f1[j - 1], f2[i - j]) + 1;
ans = Math.min(res, ans);
}
f2[i] = ans;
}
//三部手机
//枚举楼层总高度
for(int i = 1; i <= N; i ++){
//枚举开始测试楼层高度
int ans = 1005;
for(int j = 1; j <= i; j ++){
/**同样地:
*从第j层摔下,有两种结果:
* 1、碎了,则测试次数为 f2[j - 1] + 1
* 2、没碎,则测试次数为 f3[i - j] + 1
* 两者取一个max则为两台手机在楼层总高度为i时
* 开始测试楼层高度为j的最坏测试次数
* 在所有最坏开始楼层测试数中选择最好的
*/
int res = Math.max(f2[j - 1], f3[i - j]) + 1;
ans = Math.min(res, ans);
}
f3[i] = ans;
}
System.out.println(f3[N]);
}
}