zoukankan      html  css  js  c++  java
  • NOJ1370: [蓝桥杯2018初赛]测试次数-(dp)

    题目描述

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

    输出

    输出一个整数表示答案

    好久以前就见过这道谷歌面试题,大概知道要分层,dp代码写不出。不懂就搜啊!

    最佳策略表示分的层数要好,最坏运气表示必须要测到最后一下才得到结果。

    dp[i][j]表示测i层楼有j个手机在运气最坏的情况下最多需要测多少次。k表示分层的楼数。

    1.对于dp[i][1]=i,只有一个手机肯定要从下一层一层往上摔

    2.当j>=2时,就可以采用分层的思想。例如分层k=100,j=2。

    第一支手机先放100层摔一下,

    不坏就血赚,前100层都不用测了;1000层还有900层。下一次放在200层摔一下,没坏就下次就300层,坏了则只剩1只手机下次就201层开始。

    换了大赚特赚,直接定位在100层内,只要再测99层就好。下一次从第1层开始测起。

    3.可以想到摔坏得只剩1只手机时,可以利用dp[i][1]=i这个贡献。这样可以得出我们扔手机问题具有最优子结构性质。

    摔坏了用dp[k-1][j-1]+1表示,确定了硬度在k层内,取k-1层,手机数-1的结果,+1表示本次摔的。

    没摔坏用dp[i-k][j]+1表示,表示本次在i-k层的基础上一下子多测了k层,手机数j不变,+1表示本次摔的。

    import java.util.*;
    
    public class Main {
    
        public static void main(String[] args) {
            Scanner scan=new Scanner(System.in);
            
            int [][] dp=new int[1005][4];//dp[i][j]表示确定i层有j只手机的情况摔多少次
            int n=1000;
            int m=3;
            for(int i=1;i<=n;i++)
                dp[i][1]=i;//只有1只手机只能稳妥起见  每层摔一下
            
            for(int j=2;j<=m;j++) {
                for(int i=1;i<=n;i++) {
                    dp[i][j]=2000;//初始化巨大状态
                    for(int k=2;k<=i;k++) {//分k层
                        dp[i][j]=Math.min( dp[i][j] , 1+Math.max(dp[i-k][j], dp[k-1][j-1]));
                        //没摔坏就多测了k层,摔坏就变成k-1层并且手机数-1
                    }
                }
            }
            System.out.println(dp[n][m]);
        }
        
    }

     天上不会掉馅饼,努力奋斗才能梦想成真。

  • 相关阅读:
    x64 平台开发 Mapxtreme 编译错误
    hdu 4305 Lightning
    Ural 1627 Join(生成树计数)
    poj 2104 Kth Number(可持久化线段树)
    ural 1651 Shortest Subchain
    hdu 4351 Digital root
    hdu 3221 Bruteforce Algorithm
    poj 2892 Tunnel Warfare (Splay Tree instead of Segment Tree)
    hdu 4031 Attack(BIT)
    LightOJ 1277 Looking for a Subsequence
  • 原文地址:https://www.cnblogs.com/shoulinniao/p/12392546.html
Copyright © 2011-2022 走看看