C. Dora and C++

https://codeforces.com/problemset/problem/2007/C

题意:给定一个长度为n的数组v,以及数值a和b,现在可以对数组v进行无限次的+a或者+b的操作,问可能的最小极值差是多少。

思路:根据裴蜀定理,有ax + by = d,x和y存在,其中d是gcd(a, b),所以让数字a和b对数组进行操作,等价于直接用d来进行操作。首先把所有数字缩减到d的范围内,然后排序,得到初步极值差。随后,遍历所有元素,将该元素+d作为极大值,然后减去极小值,看是否更新答案即可。

总结:

inline void solve() {
    int n, a, b;
    cin >> n >> a >> b;

    vector<int> v(n);
    int g = ::gcd(a, b);
    for (auto& x : v) {
        cin >> x;
        x %= g;
    }
    sort(v.begin(), v.end());
    int ans = v.back() - v.front();
    for (int i = 1; i < n; ++i) {
        ans = min(ans, v[i - 1] + g - v[i]);
    }

    cout << ans << '\n';
}
posted @ 2025-12-16 10:43  _Yxc  阅读(3)  评论(0)    收藏  举报