蓝桥杯 2018 省 B 测试次数
url: http://oj.ecustacm.cn/problem.php?id=1370
tag:
动态规划
思路:
使用动态规划的思想,令 f[i][j]
表示在i层楼内,使用j部手机,在使用最佳策略下,最多的测试次数,换句话说就是在i层楼内,使用j部手机最少需要花费的最大的测试次数。对于只有1部手机的情况来说,有几层就要测试几次。对于0层来说,不管几部手机都是0次。因为不知道从那一层开始掉落可以得到最优的答案,所以可以枚举对于每一个i都枚举从1开始到i层,表示从第k层开始掉落得到的结果。而对于每一个k来说,需要取一个最大值一共只有两种情况一种是摔坏,那么可以是 dp[k - 1][j - 1]
表示从k - 1层内用j - 1部手机测试次数,如果没有摔坏就是 dp[i - k][j]
即,剩余的i - k层内使用j部手机测试次数,之后两者取max再加上第k层的1次,对每种k的结果取min就是最后答案。最后输出 dp[1000][3]
表示1000层内,3部手机测试次数。
代码:
// 测试次数
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n = 1000;
int dp[1001][4];
int main()
{
memset(dp, 0x3f, sizeof dp);
for (int i = 1; i <= n; i ++) dp[i][1] = i;
for (int i = 1; i <= 3; i ++) dp[0][i] = 0;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= 3; j ++)
for (int k = 1; k <= i; k ++)
dp[i][j] = min(dp[i][j], max(dp[k - 1][j - 1], dp[i - k][j]) + 1);
cout << dp[1000][3];
return 0;
}
当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »