Problem description:http://acm.pku.edu.cn/JudgeOnline/showproblem?problem_id=2590
根据要求可以得出如下论断:
2*n步最多可以上n*n+n个台阶,每步所上的台阶数组成的序列为:1,2,3...(n-1),n,n,(n-1)...3,2,1 它们的和为n*n+n。(n〉=1)——结论1
2*n-1步最多可以上n*n个台阶,每步所上的台阶数组成的序列为:1,2,3...(n-1),n,(n-1)...3,2,1 它们的和为n*n。(n〉=1)——结论2
进一步可以得出:要上n*n+x(0<x<n)个台阶,2*n步。
它的走法只需把结论2种的走法中的x大小的那步多走一次,即:1,2,3...(n-1),n,(n-1)...x,x....3,2,1 。这中走法共走了2*n-1+1=2*n步。假设2*n-1步就可以上n*n+x(0<x<n)个台阶,但由于2*n-1步最多可以上n*n个台阶(结论2),所以2*n步为上n*n+x(0<x<n)个台阶的最少步数。
根据以上推理可以得出:
区间(n*n,n*(n+1)]所需步数为:2*n
区间(n*(n+1),(n+1)*(n+1)]所需步数为:2*n+1
编程实现如下:
#include <stdio.h>
#include <math.h>
void main()
{
int i,n,a,b,x,t,r;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&a,&b);
x=b-a;
if(x==0)
printf("0/n");
else
{
t=(int)sqrt((float)x);
if(t*t==x)
r=2*t-1;
else if(x<=t*(t+1))
r=2*t;
else
r=2*t+1;
printf("%d/n",r);
}
}
}
结论:如果纯粹用模拟的方法来计算步数,时间复杂度将很大。用数学方法分析后,常数的时间复杂度就可以求出。
本文通过数学分析,解决了给定目标楼层高度时如何找到爬上该楼层所需的最少步数问题,并提供了一种高效的算法实现。

98

被折叠的 条评论
为什么被折叠?



