题目大意

鹰蛋问题.$

n\(个蛋,\)m\(层楼. 存在一层楼\)E\(,使得\)E\(以及\)E\(以下的楼层鹰蛋都不会摔碎,问最坏情况下最少多少次能够知道\)E$.

非常经典的模型,初看题目根本想不到用什么方法做,一开始可能会想到二分答案、单调队列和一些线性的东西。但是明确的说:这些都是不可行的!

正确的解法其实是\(DP\)

设计状态:

\(f[i][j]\)表示\(i\)个蛋,确定\(j\)层楼的\(E\)的答案. 如果当前在第\(k\)层扔蛋,两种可能:

  

  1. 蛋碎了,那么还剩下\(i-1\)个蛋,第\(j\)层不是\(E\)层,还有\(j-1\)层需要确定,可以从\(f[i-1][j-1]\)转移而来.

       
  2. 蛋没碎,还剩下\(i\)个蛋,第\(k\)层以下都不可能是\(E\)层了,还剩下\(j-k\)层需要确定.那么从\(f[i][j-k]\)转移而来. 注意,这里的从上往下数\(j-k\)层和从下往上数\(j-k\)层本质上是没有区别的,所以可以把这\(j-k\)层看作一个新的高\(j-k\)层的楼.

       

    接着就是重中之重了,如何转移? 事情总是朝着最坏的方向发展的. 第\(k\)层会不会摔碎实际上是不能确定的!要从最坏的状态转移而来!那么状态转移方程就是:\(f[i][j]=min(max(f[i-1][j-1],f[i][j-k])+1,f[i][j])\).

然后就可以很快写出代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
int T , cas , n , m ;
int f[ 3005 ][ 3005 ] ;
inline void solve () {
memset ( f , 0x3f , sizeof ( f ) ) ;
for ( int i = 1 ; i <= n ; i ++ ) f[ i ][ 0 ] = 0 ;
for ( int i = 1 ; i <= m ; i ++ ) f[ 1 ][ i ] = i ;
for ( int i = 1 ; i <= n ; i ++ ) {
for ( int j = 1 ; j <= m ; j ++ ) {
for ( int k = 1 ; k <= j ; k ++ )
f[ i ][ j ] = min ( f[ i ][ j ] , max ( f[ i - 1 ][ k - 1 ] , f[ i ][ j - k ] ) + 1 ) ;
}
}
}
signed main () {
scanf ( "%d" , &T ) ;
while ( T -- ) {
scanf ( "%d%d%d" , &cas , &n , &m ) ;
solve () ;
printf ( "%d %d\n" , cas , f[ n ][ m ] ) ;
}
return 0 ;
}

[POJ3783]Balls 题解的更多相关文章

  1. poj3783 Balls

    Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1110   Accepted: 721 Description ...

  2. CF755G PolandBall and Many Other Balls 题解

    从神 Karry 的题单过来的,然后自己瞎 yy 了一个方法,看题解区里没有,便来写一个题解 一个常数和复杂度都很大的题解 令 \(dp_{i,j}\) 为 在 \(i\) 个球中选 \(j\) 组的 ...

  3. CF850F Rainbow Balls 题解

    考虑最后变成哪一种颜色. 设 \(s = \sum\limits_{i=1}^n a_i\) 设现在有 \(k\) 种当前颜色, 需要全部变成该种颜色, 期望步数为 \(f_k\). 考虑状态转移.设 ...

  4. 蓝桥杯-摔手机问题【dp】

    非常详细的题解:戳这里 例题:poj-3783 Balls Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 115 ...

  5. HDU5781 ATM Mechine(DP 期望)

    应该是machine 和POJ3783 Balls类型相似. 现在上界为i元,猜错次数最多为j时,开始猜测为k元,有两种情况: 1 猜中:(i - k + 1) * dp[i - k][j] 2 猜不 ...

  6. 题解-CF755G PolandBall and Many Other Balls

    题面 CF755G PolandBall and Many Other Balls 给定 \(n\) 和 \(m\).有一排 \(n\) 个球,求对于每个 \(1\le k\le m\),选出 \(k ...

  7. POJ 3687 Labeling Balls(拓扑排序)题解

    Description Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them ...

  8. 【题解】Popping Balls AtCoder Code Festival 2017 qual B E 组合计数

    蒟蒻__stdcall终于更新博客辣~ 一下午+一晚上=一道计数题QAQ 为什么计数题都这么玄学啊QAQ Prelude 题目链接:这里是传送门= ̄ω ̄= 下面我将分几个步骤讲一下这个题的做法,大家不 ...

  9. 洛谷 CF399B【Red and Blue Balls】题解

    n年没有更博客:我总结出了规律,当学的东西很难得时候都去学习,没有时间写博客,只有 内容对于我这种蒟蒻友好,又让我非常闲的慌时才写博客,这种博客以后也没有价值(也有些是做完一道题有成就感写的) 最近内 ...

随机推荐

  1. Kubernetes实战指南(三十一):零宕机无缝迁移Spring Cloud至k8s

    1. 项目迁移背景 1.1 为什么要在"太岁"上动土? 目前公司的测试环境.UAT环境.生产环境均已经使用k8s进行维护管理,大部分项目均已完成容器化,并且已经在线上平稳运行许久. ...

  2. bzoj3155Preprefix sum

    bzoj3155Preprefix sum 题意: 询问一个数组前缀和数组的前缀和,支持单点修改. 题解: SSi=sigma(i,1,n)(n-i+1)*ai=(n+1)*Si-sigma(i,1, ...

  3. Linux-常见的命令

    1.杀掉tomcat进程 ps  -ef  |grep  tomcat kill  -9  pid 2.启动http服务 service  httpd  start 3.停止mysql服务 servi ...

  4. JavaScript 基础 学习(三)

    JavaScript 基础 学习(三) 事件三要素 ​ 1.事件源: 绑定在谁身上的事件(和谁约定好) ​ 2.事件类型: 绑定一个什么事件 ​ 3.事件处理函数: 当行为发生的时候,要执行哪一个函数 ...

  5. jquery文件表单上传

    1. 引入jquery文件  <script src="js/jquery-2.1.1.min.js"></script> 2. 创建form表单,如下: ...

  6. 第一章:Activity的生命周期和启动模式

    Activity是Android中四大组件之首,所以需要重视,尤其是启动方式,在AndroidManifest.xml中的注册信息 (一)Activity的生命周期 1.1.1 正常情况下的生命周期 ...

  7. Java面试题汇总(持续更新)

    1. ==和equals的区别 答: 基础数据类型比较:只能使用==,比较值是否相等 引用数据类型比较: 没有重写equals方法:==和equals没有区别,比较的都是引用是否指向了同一块内存 重写 ...

  8. 设计模式:Adapter模式

    目的:复用代码和兼容以前的代码 思想:提供一个中间层,做兼容 方法:“继承”的方式,“委托”的方式 继承关系图: 委托方式 继承方式 例子: //原来的打印 class Print { public: ...

  9. 想进大厂?字节跳动等独角兽公司都在招募Python工程师!(Python就是第一语言)

    在本文章中,作者通过自身经历,力求客观的谈谈个人选择学习Python的动机,以及独角兽公司对Python工程师的要求及薪资. 从目前各种迹象(企业招聘,语言排名等)看来Python相对Java应该是暂 ...

  10. java 成员变量和局部变量的区别

    将对象的存储在数组中会报错 public static void main(String[] args) { ArrayList<Goods> arrayList = new ArrayL ...