1081:算步数分数: 2
时间限制:1 秒
内存限制:32 兆
特殊判题: 否
提交:4
解决: 1
题目描述
给你坐标轴上的两个点A和B,请问从A走到B最少需要多少步?
我们对走的每一步的步长作出如下限制:
第一步和最后一步的步长必须是1,其他的任意一步的步长必须比前一步的步长小1、大1或相等。
输入格式
输入包含多组测试数据。每组输入两个整数A和B(0<=A<=B<2^31)。
输出
对于每组输入,输出从A走到B最少需要多少步。
样例输入
45 48
45 49
45 50
样例输出
3
3
时间限制:1 秒
内存限制:32 兆
特殊判题: 否
提交:4
解决: 1
题目描述
给你坐标轴上的两个点A和B,请问从A走到B最少需要多少步?
我们对走的每一步的步长作出如下限制:
第一步和最后一步的步长必须是1,其他的任意一步的步长必须比前一步的步长小1、大1或相等。
输入格式
输入包含多组测试数据。每组输入两个整数A和B(0<=A<=B<2^31)。
输出
对于每组输入,输出从A走到B最少需要多少步。
样例输入
45 48
45 49
45 50
样例输出
3
3
4
思路:
由于看到分类在数学,想到由数学方法解决。
由于开头与结尾都是1,因此考虑从1开始加到某值在逐次递减1直至达到1,即类似1+2+3+...n-1+n+n-1+...+3+2+1;
可以保证和最大且项数最少。
计算可知1+2+3..+n+...+3+2+1=n^2;
因此我们去寻找平方比步数小的最大的数(遍历一次即可得)。
然后看差值,用差值除以n,即我们可以去多走几次最大步数,商即为多走的次数
然后在用差值对n求余,若余数为0则已无剩余步数,若不为0则总步数+1.
(比如余7,而我现在的步数为9+8 -+7+6+5+4+3+2+1,那么我直接插入在8+7之间即可)
所以总步数就等于2n-1加上商加上是否有余数的一步;
代码如下:
#include<cstdio>
using namespace std;
int