solution to Steps

来源:互联网 发布:淘宝上的水果放心吗 编辑:程序博客网 时间:2024/04/29 19:47

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

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

原创粉丝点击