NOI2019模拟赛 T1牛油果
创始人
2025-05-29 04:51:44

题目描述

牛油果是一种神秘的水果,其具有一个坚固程度x≥0x\geq 0x≥0:即从高度不超过xxx米的地方掉下来都不会受损,否则就会破碎。

现在有nnn个牛油果可以用来做实验,如果某个牛油果在一次实验中破碎了就不能继续做实验,否则就可以继续拿来做实验。

假设给出的牛油果坚固程度相同,且已知它们的坚固程度不超过mmm,现在要求最坏情况下至少做多少次实验可以得知它们的坚固程度。

输入格式

一行一个ttt,表示数据组数。

一行两个正整数n,mn,mn,m。

输出格式

输出ttt行,第iii行一个正整数表示第iii组数据的答案。

样例输入

2
1 2
2 10

样例输出

2
4

数据规模

对于10%10\%10%的数据,n,m,t≤10n,m,t\leq 10n,m,t≤10
对于30%30\%30%的数据,n,m,t≤50n,m,t\leq 50n,m,t≤50
对于60%60\%60%的数据,n,m,t≤500n,m,t\leq 500n,m,t≤500
对于100%100\%100%的数据,n,m,t≤5000n,m,t\leq 5000n,m,t≤5000


题解

设fi,jf_{i,j}fi,j​表示有iii个牛油果,坚固程度不超过jjj的最少的实验次数,fff的初值为fi,0=0f_{i,0}=0fi,0​=0,f0,i=+∞f_{0,i}=+\inftyf0,i​=+∞。

考虑转移,假设此时将一个牛油果从kkk米高的地方扔下来,则

  • 如果碎了,那么牛油果的坚固程度不超过k−1k-1k−1,还剩i−1i-1i−1个牛油果,则需要的次数为fi−1,k−1+1f_{i-1,k-1}+1fi−1,k−1​+1
  • 如果没碎,那么牛油果的坚固程度在kkk到jjj之间,还剩iii个牛油果,在kkk到jjj之间测试坚固程度等价于在000到j−kj-kj−k之间测试坚固程度,所以需要的次数为fi,j−k+1f_{i,j-k}+1fi,j−k​+1

所以转移式为

fi,j=min⁡k=1j{max⁡(fi−1,k−1,fi,j−k)+1}f_{i,j}=\min\limits_{k=1}^j\{\max(f_{i-1,k-1},f_{i,j-k})+1\}fi,j​=k=1minj​{max(fi−1,k−1​,fi,j−k​)+1}

得到所有的fff值,即可O(1)O(1)O(1)输出答案。

这样做的时间复杂度为O(n3)O(n^3)O(n3),会TLE。

code

#include
using namespace std;
const int N=5000;
int t,n,m,now;
long long f[5005][5005]; 
int main()
{f[0][0]=0;for(int i=1;i<=N;i++) f[0][i]=1e18;for(int i=1;i<=N;i++){f[i][0]=0;for(int j=1;j<=N;j++){f[i][j]=1e18;for(int k=1;k<=j;k++){f[i][j]=min(f[i][j],max(f[i][j-k],f[i-1][k-1])+1);}}}scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);printf("%lld\n",f[n][m]);}return 0;
}

我们考虑优化。

对于求fi,jf_{i,j}fi,j​,需要用到的数为fi−1,k−1f_{i-1,k-1}fi−1,k−1​和fi,j−kf_{i,j-k}fi,j−k​,其中1≤k≤j1\leq k\leq j1≤k≤j。我们发现随着kkk的增大,fi−1,k−1f_{i-1,k-1}fi−1,k−1​单调递增(不严格),fi,j−kf_{i,j-k}fi,j−k​单调递减(不严格)。那么它们的图象大致如下

在这里插入图片描述
jjj增加了111之后,fi−1,k−1f_{i-1,k-1}fi−1,k−1​部分不变,fi,j−kf_{i,j-k}fi,j−k​向右平移一位。我们可以发现,fi,j+1f_{i,j+1}fi,j+1​选择的kkk一定在fi,jf_{i,j}fi,j​选择的kkk的右边(不严格),所以kkk的枚举可以省去。

在这里插入图片描述

时间复杂度为O(n2)O(n^2)O(n2)。

code

#include
using namespace std;
const int N=5000;
int t,n,m,now;
long long f[5005][5005]; 
int main()
{
//	f[0][0]=0;
//	for(int i=1;i<=N;i++) f[0][i]=1e18;
//	for(int i=1;i<=N;i++){
//		f[i][0]=0;
//		for(int j=1;j<=N;j++){
//			f[i][j]=1e18;
//			for(int k=1;k<=j;k++){
//				f[i][j]=min(f[i][j],max(f[i][j-k],f[i-1][k-1])+1);
//			}
//		}
//	}f[0][0]=0;for(int i=1;i<=N;i++) f[0][i]=1e18;for(int i=1;i<=N;i++){f[i][0]=0;now=0;for(int j=1;j<=N;j++){while(now+1<=j-1&&max(f[i][now+1],f[i-1][j-1-now-1])<=max(f[i][now],f[i-1][j-1-now])) ++now;f[i][j]=max(f[i][now],f[i-1][j-1-now])+1;}}scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);printf("%lld\n",f[n][m]);}fclose(stdin);fclose(stdout);return 0;
}

其实还有一个小优化,因为我们可以二分查找坚固程度,所以最多只需要log⁡m\log mlogm次即可得出牛油果的坚固程度,log⁡m≤13\log m\leq 13logm≤13。也就是说,我们的iii只需从111枚举到131313即可,不需要上述的优化。

时间复杂度为O(13n2)O(13n^2)O(13n2),勉强能过。

code

#include
using namespace std;
const int N=5000;
int t,n,m,now;
long long f[15][5005]; 
int main()
{f[0][0]=0;for(int i=1;i<=N;i++) f[0][i]=1e18;for(int i=1;i<=13;i++){f[i][0]=0;for(int j=1;j<=N;j++){f[i][j]=1e18;for(int k=1;k<=j;k++){f[i][j]=min(f[i][j],max(f[i][j-k],f[i-1][k-1])+1);}}}scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);if(n>13) n=13;printf("%lld\n",f[n][m]);}return 0;
}

如果你将两种优化方法结合,那么你的代码会跑得飞快。

时间复杂度为O(13n)O(13n)O(13n)。

#include
using namespace std;
const int N=5000;
int t,n,m,now;
long long f[15][5005]; 
int main()
{f[0][0]=0;for(int i=1;i<=13;i++) f[0][i]=1e18;for(int i=1;i<=13;i++){f[i][0]=0;now=0;for(int j=1;j<=N;j++){while(now+1<=j-1&&max(f[i][now+1],f[i-1][j-1-now-1])<=max(f[i][now],f[i-1][j-1-now])) ++now;f[i][j]=max(f[i][now],f[i-1][j-1-now])+1;}}scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);if(n>13) n=13;printf("%lld\n",f[n][m]);}fclose(stdin);fclose(stdout);return 0;
}

相关内容

热门资讯

项目实战典型案例4——生产环境... 生产环境app打包导致不能自动升级的问题一:背景介绍问题背景:二...
奔奔mini-e怎么样-车主点... 今天给各位分享奔奔mini-e怎么样-车主点评-真实评价-口碑的知识,其中也会对奔奔mini10进行...
逍客逍客最新报价-图片-参数(... 本篇文章极速百科给大家谈谈逍客逍客最新报价-图片-参数,以及逍客2022款报价及参数对应的知识点,希...
全国违章查询在线查询_全国交通... 今天给各位分享全国违章查询在线查询_全国交通违章查询的知识,其中也会对全国违章查询网站在线进行解释,...
道路救援车拖车怎么收费-百度有... 今天给各位分享道路救援车拖车怎么收费-百度有驾的知识,其中也会对道路救援拖车费怎么算进行解释,如果能...
java 每日一练 (8) 文章目录1. 单选题2. 编程题 1. 单选题   1. 下列选项中关于 java 中 super ...
滁新高速淮南段发生一交通事故致... 本篇文章极速百科给大家谈谈滁新高速淮南段发生一交通事故致3人死亡,以及滁新高速淮南段拥堵对应的知识点...
快递投诉电话多少(极兔快递投诉... 今天给各位分享快递投诉电话多少的知识,其中也会对极兔快递投诉电话多少进行解释,如果能碰巧解决你现在面...
五羊本田小公主有几款?(五羊本... 本篇文章极速百科给大家谈谈五羊本田小公主有几款?,以及五羊本田小公主多少钱一台对应的知识点,希望对各...
红蓝buff是什么(红蓝buf... 本篇文章极速百科给大家谈谈红蓝buff是什么,以及红蓝buff是什么意思网络用语对应的知识点,希望对...
Gitee搭建个人博客(Bea... 目录一、引言二、博客模板选型 - Jekyll三、安装Jekyll环境3.1 安装Ruby3.2 安...
记一次磁盘扩容 起因 在使用firefly板子时,刷完固件发现根目录竟然只有3G,根本没...
开车撞死人怎么处理与赔偿?撞死... 今天给各位分享开车撞死人怎么处理与赔偿?撞死人协商最佳时间的知识,其中也会对开车撞死人要赔偿多少钱进...
ulzzang是什么牌子(ul... 本篇文章极速百科给大家谈谈ulzzang是什么牌子,以及ulzzang是什么牌子鞋对应的知识点,希望...
中国各重点城市豪车数量排名:北... 今天给各位分享中国各重点城市豪车数量排名:北上深广包揽前四!的知识,其中也会对中国地区豪车排行榜进行...
大分辨率数据集切割 前言:对于航拍、遥感影像数据集而言,此类数据集包含较多目标,...
叠信纸的四种方法(叠信纸的四种... 本篇文章极速百科给大家谈谈叠信纸的四种方法,以及叠信纸的四种方法a4多张图片对应的知识点,希望对各位...
记录Quartz在项目中的使用... 黑马传智健康项目中遇到的技术,感觉这个解决思路挺新颖的,就记录下来了。用...
Opengauss CLOG模... 上篇讲解了opengauss CLOG模块分区优化原理篇,本文将从源代码实现层面讨论具...
广汽三菱放大招2021款奕歌燃... 今天给各位分享广汽三菱放大招2021款奕歌燃情版上市售价16.78万元的知识,其中也会对广汽三菱弈歌...
科斯沃斯引擎(科斯沃d037)... 今天给各位分享科斯沃斯引擎的知识,其中也会对科斯沃d037进行解释,如果能碰巧解决你现在面临的问题,...
展望过去,想象未来,瑞航360... 今天给各位分享展望过去,想象未来,瑞航360全景2018新征程的知识,其中也会对瑞航lx188机型进...
考研数二第四讲 分段函数的复合... 分段函数的复合函数求分段函数的复合函数,这是考研高数中的一个重要考点。专升本的高数不考...
7座MPV车型推荐,7座MPV... 本篇文章极速百科给大家谈谈7座MPV车型推荐,7座MPV车型大全,以及7座mpv汽车大全2020对应...
支付宝怎么取消自动续费(苹果手... 今天给各位分享支付宝怎么取消自动续费的知识,其中也会对苹果手机支付宝怎么取消自动续费进行解释,如果能...
TH是什么意思(Things是... 本篇文章极速百科给大家谈谈TH是什么意思,以及Things是什么意思翻译对应的知识点,希望对各位有所...
上汽大众途观怎么样(上汽大众途... 本篇文章极速百科给大家谈谈上汽大众途观怎么样,以及上汽大众途观l2022版质量对应的知识点,希望对各...
solidworks转urdf... 是用solidworks成功导出了一次urdf,记录一下导出时各参数的说明。 基座的...
如何买火车票网上订票?网上买火... 今天给各位分享如何买火车票网上订票?网上买火车票怎么买的知识,其中也会对怎样买网上火车票进行解释,如...
加美机油质量怎么样?加美润滑油... 本篇文章极速百科给大家谈谈加美机油质量怎么样?加美润滑油排名第几,以及加美机油咋样对应的知识点,希望...