• 扔鸡蛋


    Description

    Jzj要来做一个经典的实验:测试鸡蛋壳的坚硬程度。

    Jzj正好处于N层高的摩天大楼中,所以通过从某一楼层向下扔鸡蛋来测试鸡蛋壳的坚硬程度。

    Jzj有M个鸡蛋,所有的鸡蛋硬度都一样。如果鸡蛋从第L层摔下去没有碎,而在L+1层摔碎了,那么称鸡蛋的硬度是L。嗯,反正jzj不喜欢吃鸡蛋,所以不用担心浪费的问题。大楼共有N层高,如果在N层还没有摔碎,就认为硬度是N;如果在第1层就碎了,硬度为0。

    虽然jzj不喜欢吃鸡蛋,但是jzj的好朋友yk特别喜欢吃鸡蛋。为了帮好朋友保护可怜的小鸡蛋,jzj想知道用这么多鸡蛋,最少摔几次就可以保证测试出它们的硬度。

    Analysis

    一开始想到了二分,每次都选择楼层中间扔,啪叽碎掉之后长度缩减一半,直到只剩一个鸡蛋每层试扔一次。

    但是我忽视了一个问题。首先明白一件事情,对于高度大于1的楼层,鸡蛋越多越好。那么在这个前提下探究这个问题,如果在低于中间部分的楼层扔鸡蛋,有两种情况,碎和不碎。

    • 如果不碎,那么多一个鸡蛋探索更多的楼层也未尝不会更优
    • 如果碎了,那么碎掉一个鸡蛋却可以只用探究更少的楼层

    那么低楼层绝对存在优于中间楼层的情况,而高楼层无需分析,理由同上。

    所以只能采用动态规划了,因为不具有有序性无法二分所以对于i层楼只能枚举1到i/2层楼,寻找max(dp[j-1][k-1],dp[i-j][k])的最小值即可。

    为了方便,递归比较好写。

    Code

    #include <bits/stdc++.h>
    
    int m,n,dp[1010][1010];
    
    int search(int h,int e){
    	if(e==1)return dp[h][e]=h;
    	if(!h)return 0;
    	if(dp[h][e]<0x3f3f3f3f)return dp[h][e];
    	for(int i=1;i<=h/2+1;i++)
    		dp[h][e]=std::min(dp[h][e],std::max(search(i-1,e-1),search(h-i,e))+1);
    	return dp[h][e];
    }
    
    int main(){
    	freopen("eggs.in","r",stdin);
    	freopen("eggs.out","w",stdout);
    	std::cin>>m>>n;
    	memset(dp,0x3f3f3f3f,sizeof(dp));
    	std::cout<<search(n,m)<<std::endl;
    	return 0;
    }
    
  • 相关阅读:
    深度学习工具
    rcnn学习(六):imdb.py学习
    r-cnn学习(六):RPN及AnchorTargetLayer学习
    r-cnn学习(五):SmoothL1LossLayer论文与代码的结合理解
    liunx学习(一):linux下目录操作大全
    Caffe学习系列(17): blob
    r-cnn学习(四):train_faster_rcnn_alt_opt.py源码学习
    faster r-cnn 在CPU配置下训练自己的数据
    R-FCN、SSD、YOLO2、faster-rcnn和labelImg实验笔记(转)
    如何学习caffe
  • 原文地址:https://www.cnblogs.com/qswx/p/9494237.html
Copyright © 2020-2023  润新知