C. Qpwoeirut And The City
https://codeforces.com/problemset/problem/1706/C
题意:给定n个building,每个building有一个高度,而且某个building前面和后面有building,并且前后的builing高度小于它,则它是cool的。现在可以对building高度进行增加,让cool building最多的情况下,最少需要增加多少的高度。
思路:如果n是奇数,那么只有一种解决方案,一次遍历即可。如果n是偶数,那么至少有一对[i, i + 1]都不是cool building。先求出一种解决方案,然后用这种解决方案去进行递推,取代价最小的结果即可。
总结:奇数情况好想,也知道数量应该是(n - 1) / 2,但是偶数的所有可能没有列举出来,如果列举出偶数排列的所有cool可能性,然后观察所有可能性之间的联系,进行递推就行了。思路就是,删除上一次结果的某个代价,然后将代价换位另一个新的代价。。
inline void solve() {
int n;
cin >> n;
vector<int> a(n);
for (auto& x : a) {
cin >> x;
}
long long ans = 0;
if (n & 1) {
for (int i = 1; i < n - 1; i += 2) {
int l = std::max(0, a[i - 1] - a[i] + 1);
int r = std::max(0, a[i + 1] - a[i] + 1);
ans += max(l, r);
}
}
else {
auto get = [&](int x) {
return std::max(std::max(a[x - 1], a[x + 1]) - a[x] + 1, 0);
};
long long res = 0;
for (int i = 1; i < n - 1; i += 2) {
res += get(i);
}
ans = res;
for (int i = n - 2; i - 2 >= 0; i -= 2) {
res -= get(i - 1);
res += get(i);
ans = min(ans, res);
}
}
cout << ans << '\n';
}

浙公网安备 33010602011771号