D. Add to Neighbour and Remove

https://codeforces.com/problemset/problem/1462/D

题意:给定含有n个元素的数组a,问最少执行多少次操作后可以让数组中所有的元素相等。操作:选择ai,消除ai,并将ai的数值加到前面或后面元素

思路:操作的特性说明数组总和sum不变,于是可以得出剩下的可能元素数需满足可以被sum整除这个条件。于是可以求出所有的可能的解,随后我们考虑能否将n个元素分为当前正在考虑的剩余元素数量(n - k)个元素,我们只要保证可以分为(n - k)个块,并且每个块的元素都是sum / (n - k)即可。

总结:没思路,还是得看solution。应该属于思维题,然后sum求因子时间复杂度还可以优化,O(n)或者O(sqrt(sum))

inline void solve() {
	int n;
	cin >> n;

	vector<int> a(n);
	for (auto& x : a) {
		cin >> x;
	}

	int sum = accumulate(a.begin(), a.end(), 0);

	vector<int> v;
	for (int i = 0; i < n; ++i) {
		if (sum % (n - i) == 0) {
			bool ok = true;
			vector<int> b;
			int t = sum / (n - i);
			for (int j = 0; j < n; ++j) {
				if (b.empty()) {
					b.push_back(a[j]);
				}
				else if (b.back() < t) {
					b.back() += a[j];
				}
				else {
					b.push_back(a[j]);
				}
				if (b.back() > t) {
					ok = false;
					break;
				}
			}
			if (ok && b.size() == (n - i)) {
				cout << i << '\n';
				return;
			}
		}
	}
}
posted @ 2025-03-24 11:23  _Yxc  阅读(6)  评论(0)    收藏  举报