AB 实验同学每天都很苦恼如何可以更好地进行 AB 实验,每一步的流程很重要,我们目标为了缩短所需的步数。
我们假设每一步对应到每一个位置。从一个整数位置 x
走到另外一个整数位置 y
,每一步的长度是正整数,每步的值等于上一步的值 -1
, +0
,+1
。求 x
到 y
最少走几步。并且第一步必须是 1
,最后一步必须是 1
,从 x
到 y
最少需要多少步。
x
为 6
,另外一个整数位置 y
为 12
,我们需要从 x
走到 y
,最小的步数为:1
,2
,2
,1
,所以我们需要走 4
步。x
为 34
,另外一个整数位置 y
为 45
,我们需要从 x
走到 y
,最小的步数为:1
,2
,3
,2
,2
,1
,所以我们需要走 6
步。x
为 30
,另外一个整数位置 y
为 50
,我们需要从 x
走到 y
,最小的步数为:1
,2
,3
,4
,4
,3
,2
,1
,所以我们需要走 8
步。输入包含 2
个整数 x
,y
。(0<=x<=y<2^31
)
对于每一组数据,输出一行,仅包含一个整数,从 x
到 y
所需最小步数。
6 12
34 45
30 50
4
6
8
代码:
int minSteps(int x, int y) {
int D = y - x;
int steps = 0;
int sum = 0;
while (sum < D || (sum - D) % 2 != 0) {
steps++;
sum += steps;
}
return steps;
}
int main() {
int x, y;
while (std::cin >> x >> y) {
std::cout << minSteps(x, y) << std::endl;
}
return 0;
}
先走出一个( 总和小于 $y - x$ 的 )( 最大的 ) 单峰数列, 然后就可以选择把数列中的某些数重复, 来凑到刚好数列和等于 $y-x$