zoukankan      html  css  js  c++  java
  • UVA

    题目链接

    题目大意:给你n个规格一样的气球和一栋大楼的高度,求最少试验几次能测出气球最高在哪一层掉下来不破。

    如果这道题想用(dp[i][j]=用i个气球测出j高度的楼需要几次)来作为状态的话,那你就输了,因为楼的高度太大了。

    正确的做法是用(dp[i][j]=用i个气球测j次最高能测出多高的楼)来作为状态。假设你现在手里有i个球,要求测j次,最高能测出h层来,你在第k层楼上测,如果球破了,那么你手里还剩下i-1个球,则问题转化成了(用i-1个球测j-1次测出k-1层以下的楼);如果球没破,那么你手里依旧有i个球,则问题转化成了用(i个球测j-1次测出k层以上的楼),由于不确定球是否会破,所以两个任务都必须能够完成,因此能测出的最大高度为$dp[i][j]=dp[i-1][j-1]+dp[i][j-1]+1$,+1是因为你在第k层测了一次以后,第k层就已经废掉了,不用再测了,因此可以把第k层作为“多出来的那一层”。

    有点逆向思维的感觉。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef unsigned long long ll;
     4 const int N=100+10;
     5 ll dp[N][N];
     6 int n;
     7 ll h;
     8 
     9 int main() {
    10     for(int i=1; i<N; ++i)
    11         for(int j=1; j<N; ++j)
    12             dp[i][j]=dp[i-1][j-1]+dp[i][j-1]+1;
    13     while(scanf("%d%llu",&n,&h)&&n) {
    14         int i;
    15         for(i=0; i<=63; ++i)if(dp[n][i]>=h)break;
    16         if(i==64)printf("More than 63 trials needed.
    ");
    17         else printf("%d
    ",i);
    18     }
    19     return 0;
    20 }
  • 相关阅读:
    python斐波那契数列
    python装饰器
    Python文件操作
    python 第三方库的安装方法
    Ajax 基本使用学习记录
    微分方程概述
    Typora中的数学公式
    Ubuntu20.04 安装 mysql8.0 之后 root 账户无法登录
    Ubuntu20.04换源之后依旧慢?如何更有效的换源
    Ubuntu18.04更新python版本
  • 原文地址:https://www.cnblogs.com/asdfsag/p/10388845.html
Copyright © 2011-2022 走看看