[Uva10934]Dropping water balloons

题目大意:你有k个一模一样的水球,在一个n层楼的建筑物上进行测试,你想知道水球最低从几层楼往下丢可以让水球破掉。由于你很懒,所以你想要丢最少次水球来测出水球刚好破掉的最低楼层。

解题关键:令$dp[i][j]$表示$i$个气球,丢$j$次最多确定的层数

 转移方程:$dp[i][j] = dp[i - 1][j - 1] + 1 + dp[i][j - 1]$

$dp[i][j]$可以由两方面转化而来,

一方面,在$i$个气球,丢了$j-1$次时,第$j$次没破

另一方面,在第$i-1$个气球时,丢了$j-1$次,第$j$次破了,确定层数需要+1

这道题注意的是思路的转化。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[70][70],k,n;
void init(){
    for(int i=1;i<=63;i++){
        for(int j=1;j<=63;j++){
            dp[i][j]=dp[i][j-1]+dp[i-1][j-1]+1;
        }
    }
}
int main(){
    init();
    while(~scanf("%lld%lld",&k,&n)&&k){
        bool flag=false;
        k=min((int)k,63);
        for(int i=0;i<=63;i++){
            if(dp[k][i]>=n){
                flag=true;
                printf("%d\n",i);
                break;
            }
        }
        if(!flag) printf("More than 63 trials needed.\n");
    }
    return 0;
}

 

posted @ 2017-11-09 17:30  Elpsywk  阅读(195)  评论(0编辑  收藏  举报