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

浙公网安备 33010602011771号