• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
mhy12345
博客园    首页    新随笔    联系   管理    订阅  订阅

Contest20140710 eagleeggs

eagleeggs|eagleeggs.in|eagleeggs.out


题目描述:

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

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


输入格式:

一行两个整数N,H


输出格式:

一行一个整数,表示硬度


样例输入:

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\n",h);
                return 0;
        }
        if (n>31||(1<<n)>=h)
        {
                printf("%d\n",(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\n",r);
}

 

 

 

 

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

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

posted @ 2014-07-11 11:07  mhy12345  阅读(173)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3