zoukankan      html  css  js  c++  java
  • Contest20140710 eagleeggs

    eagleeggs|eagleeggs.in|eagleeggs.out


    题目描述:

    共有N个硬度相同的鹰蛋,硬度是一个整数(并且已知其不大于H),表示这个蛋从天上掉下来不摔碎的最大高度。为了找出这个最大高度,可以进行一些试验,每次实验把一个鹰蛋从一定高度扔下,根据这个鹰蛋是否摔碎可以知道真实的硬度是否大于你抛下的高度。

    求在最坏情况下试验的最少次数。


    输入格式:

    一行两个整数NH


    输出格式:

    一行一个整数,表示硬度


    样例输入:

    2 5


    样例输出:

    3


    数据范围:

    30% N<=1000 H<=1000

    对另外30% N<=100000 H<=100000

    对所有数据N<=10^9 H<=10^9

     

     

    觉得课上dp讲的太复杂了,用组合数一下就做出来了。

    注意一下爆int的处理

     

     

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    #define PROB "eagleeggs"
    #define MAXN 10100
    #define INF 0x3f3f3f3f
    typedef unsigned long long qword;
    qword dp[MAXN][30];
    qword c(int x,int y)//x<=30
    {
            if (y==1)return x;
            if (y==2)return x*(x-1)/2;
            if (y>x)return 0;
            dp[0][0]=1;
            int i,j;
            for (i=1;i<=x;i++)
            {
                    dp[i][1]=i;
                    for (j=2;j<=x;j++)
                    {
                            dp[i][j]=dp[i-1][j]+dp[i-1][j-1];
                    }
                    if (dp[i][y]>=INF)return INF;
            }
            return dp[x][y];
    }
    qword hgt(int n,int t)
    {
            qword ans=0;
            qword temp=1;
            int i,j;
            for (i=n;i>0;i--)
            {
                    temp=c(t,i);
                    if (temp==INF)return INF;
                    ans+=temp;
                    if (ans>INF)return INF;
            }
            return ans;
    }
    int main()
    {
            freopen(PROB".in","r",stdin);
            freopen(PROB".out","w",stdout);
            int i,j,k;
            int n;
            qword h;
            cin>>n>>h;
            int l=0,r=300000;
            int mid;
            if (n==1)
            {
                    printf("%d
    ",h);
                    return 0;
            }
            if (n>31||(1<<n)>=h)
            {
                    printf("%d
    ",(int)ceil(log2(h)));
                    return 0;
            }
            if (n!=2)r=10000;
            while (l+1<r)
            {
                    mid=(l+r)/2;
                    if (h<=hgt(n,mid))
                    {
                            r=mid;
                    }else
                    {
                            l=mid;
                    }
            }
            printf("%d
    ",r);
    }

     

     

     

    by mhy12345(http://www.cnblogs.com/mhy12345/) 未经允许请勿转载

    本博客已停用,新博客地址:http://mhy12345.xyz

  • 相关阅读:
    原子核结构壳模型:粒子空穴转换
    第十二周学习总结
    构建之法读书笔记5
    5.21学习总结——android开发实现用户头像的上传
    5.20团队活动
    构建之法读书笔记4
    团队项目第一阶段验收
    HTML+CSS设计个人主页
    C++文件流
    面向对象程序设计_虚函数的应用
  • 原文地址:https://www.cnblogs.com/mhy12345/p/3837276.html
Copyright © 2011-2022 走看看