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

}
posted @ 2025-04-23 09:34  _Yxc  阅读(12)  评论(0)    收藏  举报