每日一题---摔手机

x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机。
各大厂商也就纷纷推出各种耐摔型手机。x星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来,之后才允许上市流通。
x星球有很多高耸入云的高塔,刚好可以用来做耐摔测试。塔的每一层高度都是一样的,与地球上稍有不同的是,他们的第一层不是地面,而是相当于我们的2楼。
如果手机从第7层扔下去没摔坏,但第8层摔坏了,则手机耐摔指数=7。
特别地,如果手机从第1层扔下去就坏了,则耐摔指数=0。
如果到了塔的最高层第n层扔没摔坏,则耐摔指数=n。
为了减少测试次数,从每个厂家抽样3部手机参加测试。
某次测试的塔高为1000层,如果我们总是采用最佳策略,在最坏的运气下最多需要测试多少次才能确定手机的耐摔指数呢?
请填写这个最多测试次数。注意:需要填写的是一个整数,不要填写任何多余内容。
题解:
这题适用dp来做。。最坏运气即手机全部都摔坏了,才测出耐摔指数;最佳策略即尽量减少测试次数。

#include<bits/stdc++.h>
#define loop(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
int dp[5][1005];
int solve(int phone,int floor){
    //初始化,第i部手机在第j层摔坏的最坏层数为j
    loop(i,1,phone)
        loop(j,1,floor){
            dp[i][j]=j;
        }
    loop(j,2,phone){
        loop(k,1,floor){
            loop(i,1,k-1){
                //这里的DP的递推公式为f[j][k]=1+max(f[j-1][i-1],f[j][k-i]) i属于[1,k-1]
                //在1~k层中随机挑出一层i
                //如果第一部手机在第i层碎了,那么将测试1~i-1就可以找出耐摔指数,即f[1][i-1]
                //如果第一部手机在第i层没有碎,那么将测试i+1~k层便可以找出耐摔指数,即k-i层
                //有j部手机,在已知i层不碎的情况下,测试1~i-1和i+1~k层的方法没有区别,所以可以写成f[j][i-1]+1
                //+1表示在在那层已经测过
                dp[j][k]=min(dp[j][k],1+max(dp[j-1][i-1],dp[j][k-i]));
                //int num1=dp[j-1][i-1];
                //int num2=dp[j][k-i];
                //int temp=max(num1,num2);
                //dp[j][k]=min(dp[j][k],1+temp);
            }
        }
    }
    return dp[phone][floor];
}
int main(){
    cout<<solve(3, 1000);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值