C. Array Game
题意:给定长度为n的数组,每次操作可以选下标(i, j),将abs(a[i] - a[j])加到数组末尾,问经过k次操作后,数组中可以达到的最小值是多少。
思路:如果k >= 3,那么结果必然是0,只需考虑k = 1和k = 2的情况。 k = 1时,答案就是数组中的最小数,或者某两个数经过一次运算后的最小值。k = 2时,需要考虑,当前有序对(i, j)运算后得到的t,与数组a中其他的数再次运算可能得到的最小值。
总结:看了一眼没思路,看了示例也没思路,但是看到数据范围是n²的复杂度级别,慢慢延伸到了k >= 3时必定为0的逻辑,然后就考虑k= 1和2,就比较简单了。测试样例有误导性,damn。
inline void solve() {
int n, k;
cin >> n >> k;
vector<long long> a(n);
set<long long> sett;
for (auto& x : a) {
cin >> x;
sett.insert(x);
}
if (k >= 3) {
cout << 0 << '\n';
return;
}
long long ans = *min_element(a.begin(), a.end());
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
long long t = abs(a[i] - a[j]);
ans = min(ans, t);
if (k > 1) {
auto it = sett.lower_bound(t);
if (it != sett.end()) {
ans = min(ans, abs(t - (*it)));
}
if (it != sett.begin()) {
it --;
ans = min(ans, abs(t - (*it)));
}
}
}
}
cout << ans << '\n';
}

浙公网安备 33010602011771号