CF1061B

1.排序与贪心策略
将数组从小到大排序后,逐列处理方块。目标是确保每列至少保留一个方块,同时最后一列的高度需覆盖所有可能的右视图需求。通过维护当前最大高度 now,动态调整保留的方块数。
2.保留方块的计算
每列至少一个:共有 n 列,因此至少保留 n 个方块。
最后一列的特殊处理:最后一列的高度需覆盖所有之前的列,因此需要额外保留 a[n-1] - now 个方块(now 是处理完所有列后的最大高度)。
3.总可移除方块数
总方块数为所有元素之和,减去保留的方块数,即

1.排序数组
将数组从小到大排序,确保处理顺序正确。
2.遍历维护高度
初始化 now = 0,遍历每个元素 a[i]:
若 a[i] > now,则更新 now += 1(保证每列至少一个方块)。
3.计算结果
最终保留的方块数为 n + a[n-1] - now,总可移除数为总和减去该值。

#include <bits/stdc++.h>
using namespace std;

int main() {
    long long n, m, sum = 0, now = 0;
    cin >> n >> m;
    vector<long long> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
        sum += a[i];
    }
    sort(a.begin(), a.end());
    for (int i = 0; i < n; i++) {
        if (a[i] > now) now++;
    }
    cout << sum - (n + a.back() - now);
    return 0;
}
posted @ 2025-04-03 10:54  啦啦啦456123  阅读(14)  评论(0)    收藏  举报