zoukankan      html  css  js  c++  java
  • 20140710 eagleeggs DP

    鹰蛋问题

    1. 若蛋只有一个 ans=m

    2. 若蛋只有两个 见代码

    3. 若蛋的数量超过50个 数量足够每次进行二分 见代码

    4. 其他情况:

      f[i][j] 表示用 i 个蛋 尝试 j 次最坏情况下所能确定的最大高度

      初值 f[i][0]=0 f[0][j]=0 f[1][j]=j

      转移方程 f[i][j]=f[i-1][j-1]+f[i][j-1]+1

      最终要求 ans

      使 f[n][ans-1]<m f[n][ans]>=m

      用二分即可查找

    算法时间复杂度 O(√n) 空间复杂度 O(log n)

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <cmath>
     5 using namespace std;
     6 #define INF 0x3f3f3f3f
     7 #define N 55
     8 #define M 50050
     9 
    10 int n,m;
    11 int f[N][M];
    12 
    13 int main() {
    14     scanf("%d%d",&n,&m);
    15     if (n==1) {
    16         printf("%d",m);
    17         return 0;
    18     }
    19     if (n==2) {
    20         int x=(int)sqrt(m)-1;
    21         while (1) {
    22             if (x*(x+1)>=m*2) {
    23                 printf("%d",x);
    24                 return 0;
    25             }
    26             x++;
    27         }
    28     }
    29     if(n>=50) {
    30         int ans=0;
    31         while (m>0) {
    32             m>>=1; ans++;
    33         }
    34         printf("%d",ans);
    35         return 0;
    36     }
    37     for (int i=0;i<N;i++) f[i][0]=0;
    38     for (int i=0;i<M;i++) {
    39         f[0][i]=0;
    40         f[1][i]=i;
    41     }
    42     for (int i=2;i<N;i++) {
    43         for (int j=1;j<M;j++) {
    44             f[i][j]=f[i-1][j-1]+f[i][j-1]+1;
    45             if (f[i][j]>=INF) f[i][j]=INF;
    46         }
    47     }
    48    int ans=lower_bound(f[n],f[n]+M,m)-f[n];
    49     printf("%d",ans);
    50 }
    View Code
  • 相关阅读:
    PE系统盘
    python常用方法手记
    python tushare
    idea导入导出java jar包
    javaweb项目配置tomcat启动
    window安装tomcat
    解决idea控制台乱码
    maven手记
    java redis常见问题
    java mysql常见问题
  • 原文地址:https://www.cnblogs.com/fjmmm/p/3838408.html
Copyright © 2011-2022 走看看