原文链接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. vmware不能装ghost系统怎么解决

    一般情况下一台电脑最好只安装一个系统,因为多系统容易出现问题,所以很多用户都会在Vmware虚拟机上安装其他的系统,为了安装的方便,我们会选择ghost版的系统快速安装,但是有用户遇到vmware虚拟 ...

  2. tcp协议简单了解

    HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送 ...

  3. Confluence 6 数据库表-集群(Clustering)

    下面的表格包含了 Confluence 站点使用集群的信息. clustersafety 在通常的情况下,这个表格只有一条记录. safetynumber 的值是 Confluence 被用来如何找到 ...

  4. Confluence 6 已经存在的安装配置数据库字符集编码

    针对已经存在的 Confluence 安装,如果你安装的 Confluence 版本是 6.4 或者早期的版本,我们在安装的时候没有检查你数据库的字符设置. 如果你的数据库当前没有被配置使用 UTF- ...

  5. 前端javascript

    前端 JavaScript   javaScript----数据库jquery $(function(){ 执行代码   });  基本语法:$(selector).action() $(" ...

  6. 第七周学习总结-C#

    2018年8月26日 这个周二突然得知另一位老师留的暑假作业,群文件里早就上传了,我居然一直没翻到那里,要不是同学问作业做完没,我可能开学就要“真●裸考”了

  7. 数据增强(每10度进行旋转,进行一次增强,然后对每张图片进行扩充10张patch,最后得到原始图片数*37*10数量的图片)

    # -*- coding: utf-8 -*-"""Fourmi Editor This is a temporary script file.""& ...

  8. JavaScript 高级程序设计第二版

    20.4 部署 20.4.1 构建 构建过程始于在源控制中定义用于存储文件的逻辑结构.最好避免使用一个文件存放所有的JavaScript,遵循以下面向对象语言中的典型模式:将每个对象或自定义了类别分别 ...

  9. 饮冰三年-人工智能-Python-14Python基础之变量与函数

    1:函数:函数是逻辑结构化和过程化的一种编程方法.函数即变量 #参数组:**字典 *列表 def test(x,*args): print(args); print(args[0]); print(& ...

  10. 支持向量机-SMO算法简化版

    SMO:序列最小优化 SMO算法:将大优化问题分解为多个小优化问题来求解 SMO算法的目标是求出一系列的alpha和b,一旦求出这些alpha,就很容易计算出权重向量w,并得到分隔超平面 工作原理:每 ...