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

浙公网安备 33010602011771号