这是一道数学题。
Solution
设 $Z$ 去掉后六位之后为 $Z_1$,后六位为 $Z_2$。特别地,$100001 \le Z_1 \le 999998$,如果超出范围则取边界值。
接下来分类讨论:
- 当 $Z_2 < Y$ 时,最接近 $Z$ 的 $X$ 只可能为 $Z_1 \times 10^6 + Y$ 或 $(Z_1 - 1) \times 10^6 + Y$;
- 当 $Z_2 > Y$ 时,最接近 $Z$ 的 $X$ 只可能为 $Z_1 \times 10^6 + Y$ 或 $(Z_1 + 1) \times 10^6 + Y$;
- 当 $Z_2 = Y$ 时,最接近 $Z$ 的 $X$ 只可能为 $Z_1 \times 10^6 + Y$。
我们发现,$X$ 只有 $Z_1 \times 10^6 + Y$ 或 $(Z_1 \pm 1) \times 10^6 + Y$ 三种情况。
那么这道题就简单了。
Code
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <string>
#include <cstring>
#include <cctype>
#include <cmath>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <map>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
#define elif else if
#define il inline
template<typename T> T Min(T x, T y) {return x < y ? x : y;}
template<typename T> T Max(T x, T y) {return -Min(-x, -y);}
template<typename T> T Abs(T x) {return x < 0 ? -x : x;}
ll x, y, z;
int main()
{
cin >> y >> z;
x = Min(Max(100001ll, z / 1000000), 999998ll) * 1000000 + y;
ll ans = Min(Abs(x - z), Min(Abs(x - 1000000 - z), Abs(x + 1000000 - z)));
cout << ans << endl;
return 0;
}