蓝桥杯第九届试题 耐摔指数

标题:耐摔指数



x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机。
各大厂商也就纷纷推出各种耐摔型手机。x星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来,之后才允许上市流通。


x星球有很多高耸入云的高塔,刚好可以用来做耐摔测试。塔的每一层高度都是一样的,与地球上稍有不同的是,他们的第一层不是地面,而是相当于我们的2楼。


如果手机从第7层扔下去没摔坏,但第8层摔坏了,则手机耐摔指数=7。
特别地,如果手机从第1层扔下去就坏了,则耐摔指数=0。
如果到了塔的最高层第n层扔没摔坏,则耐摔指数=n


为了减少测试次数,从每个厂家抽样3部手机参加测试。


如果已知了测试塔的高度,并且采用最佳策略,在最坏的运气下最多需要测试多少次才能确定手机的耐摔指数呢?


输入数据,一个整数n(3<n<10000),表示测试塔的高度。
输出一个整数,表示最多测试多少次。


例如:
输入:
3


程序应该输出:
2


解释:
手机a从2楼扔下去,坏了,就把b手机从1楼扔;否则a手机继续3层扔下


再例如:
输入:
7


程序应该输出:
3


解释:
a手机从4层扔,坏了,则下面有3层,b,c 两部手机2次足可以测出指数;
若是没坏,手机充足,上面5,6,7 三层2次也容易测出。



思路:首先考虑测试n次能支持的最大层数的关系。

我们先考虑手机只有一部的情况,因为手机只有一部为了能使手机正确测出指数,我们只能一层一层的向上测试。

(设次数为n,能支持的最大层数f(n)

因此次数与能支持的最大层数的关系为:

    f(n)=n;

我们现在来考虑有两部手机的情况,因为有两部手机所以我们得考虑两种情况第一种便是我选个楼层扔手机碎了的情况,那手机测试得向下走,因为手机碎了,我就只剩下1部手机以及n-1次扔手机的机会,所以我们考虑在n-1次可扔手机次数里找到一部手机可支持的最大层数,而上面我们已经提到一部手机可扔数与能支持的最大层数的关系为f(n)=n;

因此f(n-1)=n-1;这样我们便把摔坏了(测试楼层下方)的最优情况求出来了。(逆向思维既然在手机只剩一部可测次数还剩n-1的情况能支持的最大层数+1便是我们两部手机在第一次应该选得最优测试楼层。这样便可以不用动态规划模拟一层层的扔求出最优解)。

第二种便是我们扔后手机没碎的情况,因为手机没碎所以我们得向楼层上方测试,但是由于我们用过一次测试的次数,所以现在还有两部手机以及n-1次可以测试手机的机会,所以我们便可以求出没摔碎(测试楼层上方)的最优层数。

所以有两部手机可测数与能支持的最大层数的关系为:

设次数为n,能支持的最大层数ff(n)

ff(n)=f(n-1)+1+ff(n-1)=ff(n-1)+n;(加1是加的用于测试的那一楼层)

化简过后你会发现就是前n项的和。

我们现在来考虑三部手机的情况,三部手机的情况跟两部手机差不多就只是测试失败后还剩两部手机,用二部手机与剩下的可用次数求出摔坏了(测试楼层下方)的最优情况,然后用三部手机与剩下的次数求出没摔碎(测试楼层上方)的最优层数。

所以有三部手机可测次数与能支持的最大层数的关系为:

(设次数为n,能支持的最大层数fff(n))

fff(n)=ff(n-1)+1+fff(n-1);

到这里我们便把三部手机的可测次数与能支持的最大层数的关系表示出来了。接下来看代码。


#include<stdio.h>
int main()
{
	int ff[100]={0};//ff[i]两部手机摔i次可以支持的最大层数
	int fff[100]={0};//fff[i]三部手机摔i次可以支持的最大层数
	int i;//摔的次数 
	int n; 
	printf("----------------------------\n");
	while(scanf("%d",&n)!=0)
	{
		i=0;
		while(fff[i]<n)
		{
			i++;
			ff[i]=ff[i-1]+i;
			fff[i]=fff[i-1]+ff[i-1]+1;
		}
		printf("%d\n",i);	
		printf("----------------------------\n");
	}
 } 


已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页