[uva 10934] Dropping water balloons - [dp]

题意:n层楼楼房,有K个水球,每个水球都有一个相同的扛摔系数。即从某层楼高及其以下的楼层摔下不会坏,而从其以上的楼层摔下会坏。问:最少需要多少次尝试能够求得扛摔系数

 

更简单的抽象:现在有一个未知数X,范围在1-n内。现在需要猜至少多少次Y,返回的结果是Y<X或Y>X或Y=X,则可以求出X

我们定义dp[i]为:猜测 i 次后能够得到的最大区间

那么有如下几种情况:

A:第 i 次返回Y<X,这种情况对dp[i]的贡献为:dp[i-1]

B:第 i 次返回Y>X,这种情况对dp[i]的贡献为:dp[i-1]

C:第 i 次返回Y=X,这种情况对dp[i]的贡献为:1

所以,dp[i] = 2 * dp[i-1] + 1

 

根据上述,定义dp[i][j]为猜测 i 次,得到 j 次 Y>X 回答后游戏结束时,能够得到的最大区间

即有:dp[i][j] = dp[i-1][j] + dp[i-1][j-1] + 1

要求的答案为:dp[i][k] >= n中的最小的 i

 

一开始觉得可能会有精度问题:如果在某个加法过程中越界long long会怎么样,又没法知道那么大数据的结果是否正确,但是样例有两个这种大数据避免了这个想法

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <cstdlib>
using namespace std;

long long n,dp[150][150];

int main()
{
    int i,j,k;
    while(scanf("%d%lld",&k,&n)&&k){
        memset(dp,0,sizeof(dp));
        int flag=0;
        for(i=1;i<=63;i++){
            for(j=1;j<=k;j++)
                dp[i][j]=dp[i-1][j]+dp[i-1][j-1]+1;
            if (dp[i][k]>=n){
                flag=1;
                break;
            }
        }
        if (flag)
            printf("%d\n",i);
        else
            puts("More than 63 trials needed.");
    }
    return 0;
}

 

全部评论

相关推荐

不愿透露姓名的神秘牛友
03-26 16:16
点赞 评论 收藏
分享
02-22 18:38
门头沟学院 Java
程序员牛肉:标准的NPC简历,一个短链接+12306。你可以在牛客上面搜一搜有多少人的简历和你一样。你自己能不能给出你一个理由让面试官在大家简历高度相同的情况下,选择约面你而不是对应的211,985学生? 是因为你即将拥有的那段小厂实习吗?这种小厂实习真的很有含金量吗?因此你可以找实习,但是你如果只能找到小厂实习的话,其实意义不太大。 但你的时间是充足的,相信我:从现在到今年的九月份大三上你就干两个事情:"写博客"+“参加开源之夏”。这两个搞好了不亚于一段大厂实习的含金量。 想要让自己变得更强,首先就是不要把自己当打工人看待,让自己简历上面的活人气息更多一点,不要让自己成为流水线的产物。你不是在出售你的技能,你是在利用你的技能和公司达成一种合作关系。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务