Arithmetic Sequence
题目链接:ARC 123A
题目大意
给你三个数,一次操作可以选一个数加一。
问你至少要多少次操作,才使得这变成一个等差序列。
思路
由于是等差序列,三个数是 a , b , c a,b,c a,b,c,那就是要 b − a = c − b b-a=c-b b−a=c−b
会发现
a
,
c
a,c
a,c 的移动其实是一样的,都是使得
(
b
−
a
)
−
(
c
−
b
)
(b-a)-(c-b)
(b−a)−(c−b) 的值变小。
然后
b
b
b 移动则变大,而且是一次变大
2
2
2。
然后计算一下就好了。
(注意如果上面那个值一开始是负数奇数,移动了
b
b
b 到
1
1
1 之后还要移动
a
,
c
a,c
a,c 一次才能到
2
2
2)
代码
#include<cstdio>
#include<iostream>
#define ll long long
using namespace std;
ll a, b, c, ans, ab, bc;
int main() {
scanf("%lld %lld %lld", &a, &b, &c);
if (b - a == c - b) {//已经是了
printf("0\n");
return 0;
}
ans = 1e18;
ab = b - a; bc = c - b;
if (ab < bc) {//要加 b,增大 ab 距离
if ((bc - ab) & 1) ans = min(ans, (bc - ab) / 2 + 2);//如果是奇数要 c 右移才可以
else ans = min(ans, (bc - ab) / 2);
}
else {//要加 c,增大 bc 距离
ans = min(ans, ab - bc);
}
printf("%lld", ans);
return 0;
}