URAL 1223. Chernobyl’ Eagle on a Roof

本文讨论了如何在有限楼层内确定鹰蛋在哪个楼层破碎,通过使用动态规划算法,最小化所需尝试次数。具体例子展示了100层楼、2个鹰蛋的情况下,仅需14次尝试即可确定鹰蛋的耐摔高度。

题目:给定楼层,鹰蛋数量。

鹰蛋的硬度E,满足楼层 小于等于E的时候,从这层楼扔下去,鹰蛋不会碎,高于E会碎。如果没碎,可以继续使用。

求最小需要确定E的值的  尝试次数(要扔几次)。

第一反应,二分。

100层楼,2个鹰蛋时,第一次试的50层。然后还需要50次。

结果答案是只需要14次尝试。所以不是简单的二分。

第一次尝试14层,若碎了,E<14还需13次尝试。共1+13=14次。

若14层没碎,E>=14,再尝试27层。

若27层碎了,14<=E<27, 还需12次尝试。共 2+12=14次。

若没碎,再尝试39,50,60,69,77,84,90,95,99层……总之不会超过14次。

还是动态规划写的,F[ i ][ j ] 表示 i 个鹰蛋,j 次尝试可以确定的最大楼层.

F[ i ][ j ]=Sum( F[ i-1 ][ k ] +1)+1   k=1,2,3,...,j-1 ;

由于递推式中有前N项和。于是,直接用的 FS[ i ][ j ] 表示 F [ i ][ j ]的前 j 项和。

int FS[1001][1001];//FS[i][j]-FS[i][j-1]表示 i个鹰蛋,j次尝试可以确定的最大楼层。
int main(void)
{
	for(int j=0;j<=1000;j++) FS[1][j]=j*(j+1)/2,FS[j][0]=0,FS[j][1]=1;
	for(int i=2;i<=1000;i++){
		for(int j=2;j<=1000;j++){
			FS[i][j]=FS[i][j-1]+FS[i-1][j-1]+j;
			if(FS[i][j]-FS[i][j-1]>=2000) break;//楼层只有1000,后面的不需要。
		}
	}
	int N,E;
	while(cin>>E>>N&&(E||N)){
		int ANS;
		for(int j=1;j<=1000;j++){//可以二分,但是懒得二分了。 
			if(FS[E][j]-FS[E][j-1]>=N) {
				ANS=j;break;
			}
		}
		cout<<ANS<<endl;
	}
return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值