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