原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1306.html

题目传送门 - 51Nod1306

题意

  有个N层的高楼和若干个棋子,所有的棋子都是一样的。棋子从楼的某层E扔到地上不会碎(0 <= E <= N),但从比这个楼层高的地方扔到地上都会碎。给出楼的高度N,以及棋子的数量M,你来找出这个E(0 <= E <= N),问最坏情况下需要实验多少次才能计算出准确的E(如果棋子摔碎了,就不能继续用这个棋子进行测试了)。

  1 <= N <= 10^18, 1 <= M <= 64

题解

  由于本题的原题目背景中的棋子是“鹰蛋”,而蛋比棋子说起来方便,所以下文中都用蛋描述。

  注意一下:一个蛋如果没有碎的话,还可以继续用!

  我一开始zz了,写个基于二分原理的假做法。wa了好久并下载了一组数据然后以为数据出锅然后百度一下才反应过来。

  我们考虑定义 $dp[i][j]$ 表示使用 $i$ 个蛋,抛 $j$ 次,能够确定的楼层总数。

  我们有 $dp[i][j]=dp[i][j-1]+dp[i-1][j-1]+1$ 。为什么是这个式子?我们分三种情况论述:

  1. 首先可以确定当前位置。 对于当前dp值的贡献:1

  2. 如果蛋没碎,那么显然这个位置以下的全部都不会碎。我们要用 $i$ 个蛋抛 $j-1$ 次来确定这个位置以上能确定的楼层数,即 $dp[i][j-1]$ 。

  3. 如果蛋碎了,那么显然这个位置以上的全部都会碎。我们要用剩余的 $i-1$ 个但抛 $j-1$ 次来确定这个位置以下能确定的楼层数,即 $dp[i-1][j-1]$ 。

  由于当 $m\leq 2$ 的时候,抛的次数可能非常多,我们把它特判掉。

  当 $m\leq 3$ 的时候,抛的次数很少了。

  我们可以 $dp$ 预处理出来,最后 lower_bound 以下就可以了。由于存在很多无用的状态(dp值过大),所以我们可以用 vector 来只存一下有用状态。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL INF=1000000000000000001LL,N=2e6;
int T;
LL n,m;
vector <LL> dp[70];
int main(){
scanf("%d",&T);
dp[0].clear();
for (int i=0;i<=N;i++)
dp[0].push_back(0);
for (int i=1;i<=64;i++){
dp[i].clear();
dp[i].push_back(0);
for (int j=1;j<=N&&dp[i][j-1]<INF;j++)
dp[i].push_back(min(dp[i][j-1]+dp[i-1][j-1]+1,INF));
}
while (T--){
scanf("%lld%lld",&n,&m);
if (m==1)
printf("%lld\n",n);
else if (m==2){
n<<=1;
LL ans=sqrt(n);
if (ans*(ans+1)<n)
ans++;
printf("%lld\n",ans);
}
else
printf("%d\n",lower_bound(dp[m].begin(),dp[m].end(),n)-dp[m].begin());
}
return 0;
}

  

51Nod1306 高楼和棋子 动态规划的更多相关文章

  1. 【BZOJ3294】放棋子(动态规划,容斥,组合数学)

    [BZOJ3294]放棋子(动态规划,容斥,组合数学) 题面 BZOJ 洛谷 题解 如果某一行某一列被某一种颜色给占了,那么在考虑其他行的时候可以直接把这些行和这些列给丢掉. 那么我们就可以写出一个\ ...

  2. BZOJ3294 CQOI2011放棋子(动态规划)

    可以看做棋子放在某个位置后该种颜色就占领了那一行一列.行列间彼此没有区别. 于是可以设f[i][j][k]表示前k种棋子占领了i行j列的方案数.转移时枚举第k种棋子占领几行几列.注意行列间是有序的,要 ...

  3. [题解+总结]动态规划大合集II

    1.前言 大合集总共14道题,出自江哥之手(这就没什么好戏了),做得让人花枝乱颤.虽说大部分是NOIP难度,也有简单的几道题目,但是还是做的很辛苦,有几道题几乎没思路,下面一道道边看边分析一下. 2. ...

  4. hdu 1087 动态规划之最长上升子序列

    http://acm.hdu.edu.cn/showproblem.php?pid=1087 Online Judge Online Exercise Online Teaching Online C ...

  5. Google面试题之100层仍两个棋子

    一道Google面试题,题目如下:"有一个100层高的大厦,你手中有两个相同的玻璃围棋子.从这个大厦的某一层扔下围棋子就会碎,用你手中的这两个玻璃围棋子,找出一个最优的策略,来得知那个临界层 ...

  6. 动态规划——线性dp

    我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...

  7. CJOJ 1087 【NOIP2010】乌龟棋 / Luogu 1541 乌龟棋(动态规划)

    CJOJ 1087 [NOIP2010]乌龟棋 / Luogu 1541 乌龟棋(动态规划) Description 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 乌龟棋的棋盘是一行N个格子,每个 ...

  8. [NOIP复习]第三章:动态规划

    一.背包问题 最基础的一类动规问题.相似之处在于给n个物品或无穷多物品或不同种类的物品,每种物品仅仅有一个或若干个,给一个背包装入这些物品,要求在不超出背包容量的范围内,使得获得的价值或占用体积尽可能 ...

  9. 【BZOJ1801】【AHOI2009】中国象棋(动态规划)

    [BZOJ1801][AHOI2009]中国象棋(动态规划) 题面 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个 ...

随机推荐

  1. Light Oj 1005

    题意: 从 n*n 的棋盘中放置 K 个 行和列不冲突的棋子 思路: 组合数学, 先选 k 个 行, k 个列, 就是 C(n,k) ^ 2; 然后 K 个棋子不相同, K ! 全排列 #includ ...

  2. axis1 创建service服务端 , axis1 客户端

    axis1 服务端配置 1.首先建立一个项目 axisTest 不需多说 2.在lib下放入需要的jar包  点击下载 :axis所需的jar包下载 3.然后需要在web.xml里面加入: <s ...

  3. linux软件安装、rpm操作命令、本地yum配置(有什么用)

    1.yum是什么? yum的全称是yellow dog updater,modified,是一个shell前端软件包管理器;基于RPM包管理,能够从指定的服务器下载RPM包并自动安装,可以自动处理依赖 ...

  4. 软件测试作业 - fault error failure

    给出的题目如下: 我的解答如下: For program 1:1. where i > 0 is the fault , it should be changed to i>= 0 to ...

  5. url加密和解密

    .NET中加密和解密有两种方式 string file="文件上(传)篇.doc";string Server_UrlEncode=Server.UrlEncode(file);s ...

  6. SELinux简介(转载)

    几乎可以肯定每个人都听说过 SELinux (更准确的说,尝试关闭过),甚至某些过往的经验让您对 SELinux 产生了偏见.不过随着日益增长的 0-day 安全漏洞,或许现在是时候去了解下这个在 L ...

  7. 三.NFS存储服务

    01. 课程回顾 备份服务概念介绍(rsync备份服务利用相应算法,实现增量数据同步) 备份服务工作方式说明: 1. 本地数据备份同步方式(类似cp命令) 2. 远程数据备份同步方式(类似scp命令) ...

  8. LeetCode(83): 删除排序链表中的重复元素

    Easy! 题目描述: 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1-&g ...

  9. mysql 各种关系代数的使用

    连接(JOIN) 选择运算表示为: R⋈S ,其中R和S为不同的两个关系 连接运算是选取两个指定关系中的属性满足给定条件的元祖连接在一起来组成一个新的关系 数学形式: JOIN 关系名1 AND 关系 ...

  10. noip 2018游记

    憋了好久的游记... 考虑到写游记是oi界的传统,所以还是应该写一篇的. day0: 上午9:30的火车出发,车上颓三国杀! 中午12:00到了大连,下午2:00才开始试机,还是得先去大连大学,在食堂 ...