PC/UVa:110608/846
这一章的题目是真难啊,不光难想,而且代码还需要高精度运算。
这最后一个算是简单的。为了用最少的步数,那么每一步就要尽可能的大,而步长是递增的,所以前一段就应该一直递增步长,然后到达一个值后再递减步长,这样才能保证第一步和最后一步都是1
。根据区间的长度,依次减去2
、4
、6
…直到最后剩下的距离不够了。此时这个距离可能有三种情况:
0
表示正好走完0 < len < step
,表示步长再递增一次就能走完step < len < 2 * step
,表示可以通过已经达到过的两个步长走完
代码可能不是很容易看懂。
#include <iostream>
using namespace std;
int calStep(int x, int y)
{
int step = 1, len = y - x;
while (len != 0){
if (len >= step + step) len -= step * 2;
else{
if (0 < len && len <= step) return 2 * step - 1;
else return 2 * step;
}
step++;
}
return 2 * (step - 1);
}
int main()
{
int n, x, y;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> x >> y;
cout << calStep(x, y) << endl;
}
return 0;
}
/*
3
45 48
45 49
45 50
*/