Update: 这次题解可能要鸽一阵子,因为我好多算法还不会,所以有些题目不太理解,等我学完基础算法再来补。
第一次打Codeforces,虽然我现在还什么都不会,但也能做出两题,还不错哦。打Codeforces还挺好玩的,之后要多打一打。
Editorial
https://codeforces.com/blog/entry/72132
Problem A. Three Friends
题意
有3个人,分别在x轴的a, b, c三个位置,在一分钟之内,每个人可以向左或者向右移动一个位置,也可以不移动。一分钟之后,每个人的最终位置为a’, b’, c’,求 ∣ a ′ − b ′ ∣ + ∣ a ′ − c ′ ∣ + ∣ b ′ − c ′ ∣ |a' - b'| + |a' - c'| + |b' - c'| ∣a′−b′∣+∣a′−c′∣+∣b′−c′∣的最小值。
题解
这是一个简单模拟题,可以用一个嵌套循环遍历a’, b’, c’的最终的三种情况: a ′ = { a − 1 , a , a + 1 } a' = \{a-1, a, a+1\} a′={a−1,a,a+1}, b ′ = { b − 1 , b , b + 1 } b' = \{b-1, b, b+1\} b′={b−1,b,b+1}, c ′ = { c − 1 , c , c + 1 } c' = \{c-1, c, c+1\} c′={c−1,c,c+1},求出其中的最小值。
代码
#include <bits/stdc++.h>
using namespace std;
int calc(int a, int b, int c)
{
return abs(a - b) + abs(a - c) + abs(b - c);
}
int main()
{
int q;
cin >> q;
for(int i = 0; i < q; i++)
{
int a, b, c;
cin >> a >> b >> c;
int ans = calc(a, b, c);
for(int da = -1; da <= 1; da++)
for(int db = -1; db <= 1; db++)
for(int dc = -1; dc <= 1; dc++)
{
int na = a + da;
int nb = b + db;
int nc = c + dc;
ans = min(ans, calc(na, nb, nc));
}
cout << ans << endl;
}
}