zoukankan      html  css  js  c++  java
  • 易碎的鸟蛋 概率DP

    1007: 易碎的鸟蛋

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 396  解决: 80
    [提交][状态][讨论版]

    题目描述

     你们知道吗?西电的跳楼塔上面有一个鸟巢。某SXBK的教授对这个鸟巢很感兴趣。经过仔细观察,他发现鸟巢中有若干枚蛋。于是他想利用这些蛋做一个试验。测试一下蛋的坚固程度。这些蛋应该是具有相同的坚硬度。存在一个非负整数E,如果从塔的第E层往下扔蛋,蛋不会破,但如果从第E+1层(包括高于E+1层)扔,蛋就会破。你要做一组试验,来找出E。最简单的方法是一层层试。但是你有多个蛋是,不必用笨方法,可以用更少的次数找出E。注意这里的次数都是指对你的方法的最坏情况且蛋破了就不能再用,还有E可以取0(直接放在地上蛋蛋是不会破的)。如果实验到了最高层蛋还不破,则认为E取最高层的层数。

    输入

    一行,蛋的个数n和楼的层数n,k<=1000。(中间一个空格)。

    请一直处理到文件结束。

    输出

    最少实验次数。

    样例输入

    1 10
    2 5

    样例输出

    10
    3

    提示

    对于第二个样例,第一次把一个蛋从三楼扔下去,如果破了就把另一个蛋从一楼开始向上测试,如果没破就从四楼开始向上测试,最坏情况下需要测试三次。


    来源

    [提交][状态][讨论版]
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    #include<vector>
    using namespace std;
    typedef long long LL;
    const int MAXN =1000;
    #define INF 0x3f3f3f3f
    /*
    dp[i][j]表示从k层以上扔下去蛋会碎而且还有j个鸟蛋
    dp[i][j] = 
    k属于1-i
    max(dp[k-1][j-1],dp[i-k][j])+1,dp[i][j] 
    */
    int dp[MAXN][MAXN];
    int n ,k;
    int Dp(int k,int j)
    {
        if( k <= 1 || j==1 )
            return k;
        if(dp[k][j])
            return dp[k][j];
        dp[k][j] = INF;
        for(int i = 1;i <= k;i++)
        {
            dp[k][j] = min(dp[k][j],max(Dp(i-1,j-1),Dp(k - i,j))+1);
        }
        return dp[k][j];
    }
    int main()
    {
        ios::sync_with_stdio(0);
        while(cin>>n>>k)
        {
            cout<<Dp(k,n)<<endl;
        }
    }
  • 相关阅读:
    线段树(updata+query)
    铁轨(栈)
    困难的串(搜索)
    素数环(简单搜索)
    编码
    opencv + numpy for python
    PIL参考手册
    八数码问题
    三维地图(BFS)
    梯田(dfs)
  • 原文地址:https://www.cnblogs.com/joeylee97/p/7404899.html
Copyright © 2011-2022 走看看