solution to Steps

本文通过数学分析,解决了给定目标楼层高度时如何找到爬上该楼层所需的最少步数问题,并提供了一种高效的算法实现。

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);
  }
 }
}

结论:如果纯粹用模拟的方法来计算步数,时间复杂度将很大。用数学方法分析后,常数的时间复杂度就可以求出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值