zoukankan      html  css  js  c++  java
  • uva 10934 装满水的气球

    题意和思路见:

    http://blog.csdn.net/shuangde800/article/details/11273123

    我的想法:

    首先问题转化一下

    将问题转化成:定义f[i][j] 表示给i个水球和j次实验机会,最高可以測试到几层~

    则会有例如以下的转移方程:

    f[i][j] = f[i][j-1] + f[i-1][j-1] + 1;

    后一部分是说选在第k层试第一次,假设摔破了,说明边界在以下的层中。

    所以说选的那个k层,k最大应该满足k <= f[i-1][j-1] + 1; 由于要保证一旦水球在第k层摔坏了。以下的全部层都能够在还有i-1个球和j-1次机会时測出来。

    前一部分表示选在k层试第一次。可是球并没有摔坏。这个时候最高就是在k层的基础上,加上 还有i个球和j-1次机会时可以再往上測几层~即f[i][j-1];

    所以综上两部分,f[i][j]最大就等于f[i-1][j-1] + 1 + f[i][j-1];

    code:

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    long long f[110][65];
    
    void init(){
          memset(f, 0, sizeof(f));
          for(int i = 1;  i < 64; i++){
                for(int j = 1; j < 64; j++){
                      f[i][j] = f[i][j-1] + 1 + f[i-1][j-1];
                }
          }
    }
    int main(){
          init();
          int k;
          long long n;
          while(scanf("%d%lld",&k,&n) != EOF){
                if(k == 0) break;
                k = min(k, 63);
                bool ok = false;
                for(int i = 0; i <= 63; i++ ){
                      if(f[k][i] >= n){
                            printf("%d
    ",i);
                            ok = true;
                            break;
                      }
                }
                if(!ok) printf("More than 63 trials needed.
    ");
          }
          return 0;
    }
    




  • 相关阅读:
    1月6日 作业 穷举
    1.4 作业
    12月31日 作业
    12月29日-练习成果
    12月30日作业-<转>字符集编码
    1.22作业
    集合
    泛型
    CPU接口练习 (仅以此程序证明 某个同学真的有毒!有毒!!!)
    继承知识点总结
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6748013.html
Copyright © 2011-2022 走看看