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);
}
}
}
结论:如果纯粹用模拟的方法来计算步数,时间复杂度将很大。用数学方法分析后,常数的时间复杂度就可以求出。
- solution to Steps
- UVa Problem Solution: 846 - Steps
- 7 Steps to MSBuild
- First Steps to Scala
- First Steps to Scala
- First Steps to Scala
- First Steps to Scala
- Solution to DeadLock
- ACM--steps--dyx--1.2.5--The Seven Percent Solution
- 12 Steps to Better Code
- 10 Steps to Better C++
- Regular steps to install Ubuntu
- Basic steps to install gstreamer
- Steps to migrate VM Workstation
- Stand Steps to resovle Confict
- Steps to compile Android 4.0
- Ten Steps To Profitable Trading
- How to get a solution?
- Tapestry 学习 2
- SpringFramework(9)
- SpringFramework(10)
- SpringFramework(11) (完)
- DataList嵌套,分页,点击父DataList标题在子DataList显示相关的内容,点击子DataList标题显示主要内容.
- solution to Steps
- 不想睡
- Java编程:配置tomcat5数据源心得
- JSTL教程
- 调试JSTL碰到的问题,真的是,无语.....
- ASP.NET 2.0 绑定高级技巧
- JSTL 访问SQL和XML内容
- JSTL 标签库介绍
- 使用JSTL标签来访问list并判断list中的选中项