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 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  阅读(16)  评论(0)    收藏  举报