码迷,mamicode.com
首页 > 其他好文 > 详细

LGU67496 小$s$的玻璃弹珠

时间:2019-05-04 11:50:40      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:思路   http   inline   检测   print   std   pre   str   题意   

题意

在一幢\(m\)层建筑你将获得\(n\)个一样的鸡蛋,从高于\(x\)的楼层落下的鸡蛋都会碎。如果一个蛋碎了,你就不能再把它掉下去。
你的目标是确切地知道\(x\)的值。问至少要扔几次才能确定。
\(1 \leq n \leq 100,1 \leq m\leq 10000\)

思路

\(f[move][i]\)表示移动\(move\)次,\(i\)个鸡蛋,最优解的最坏条件下可以检测的楼层数\(x\)

\(f[move-1][i-1]=x_0,f[move-1][i]=x_1\)
假设第\(move\)次时,从\(n0+1\)层丢下鸡蛋:

  • 鸡蛋破了
    剩下\(move-1\)次机会和\(i-1\)个鸡蛋,可以检测\([1,x_0]\)层楼
  • 鸡蛋没破
    剩下\(move-1\)次机会和\(i\)个鸡蛋,可以检测上面的\([x_0+1,x_0+1+x_1]\)层楼
    因此,这样子可以检测\(x_0+x_1+1\)
    转移方程:\(f[x,k]=f[x-1,k-1]+f[x-1,k]+1\)

然后只要\(k\)循从大到小来,就可以压掉一位空间,当第一次有\(f\)超过\(m\)时,\(move\)就是答案了

#include <bits/stdc++.h>
int move,n,m,dp[105];
int main(){
    scanf("%d%d",&n,&m);
    for (move=0;dp[n]<m;move++)
        for (int i=n;i>=1;i--)
            dp[i]+=dp[i-1]+1;
    printf("%d",move);
}

思路有趣,代码简短,感谢王子昂同学的推荐
俗称扔鸡蛋问题:很好的一篇文章

LGU67496 小$s$的玻璃弹珠

标签:思路   http   inline   检测   print   std   pre   str   题意   

原文地址:https://www.cnblogs.com/flyfeather6/p/10807800.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!