文章目录

题解 LGP9390 金盏花

由 hycqwq 发布

这是一道数学题

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;
}

暂无评论

发表评论