Fox and Box Accumulation 题解

发布时间 2023-08-05 19:01:16作者: xvl

题目传送门

一道贪心题。

我们先将箱子的力量值从小到大排序,优先将小的放顶上,只要还能在底下放就放,否则就到下一个堆。

为什么要从小到大往下放呢?因为越小的力量值能放的位置就越少,所以尽早放一定是最优的。相反,力量值大的选择更多。

Code

#include <bits/stdc++.h>
#define ll long long
#define INF 1e9
using namespace std;
int n, ans;
int a[105];
bool vis[105]; // vis[i] = 1 表示这个箱子已经用过了
signed main() {
    ios :: sync_with_stdio(0);
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i];
    sort(a + 1, a + 1 + n);
    for (int i = 1; i <= n; i++) {
        if (vis[i]) continue;
        vis[i] = 1;
        int cnt = 1; // 当前最顶上有 1 个
        for (int j = i + 1; j <= n; j++) {
            if (!vis[j] and cnt <= a[j])  {
                vis[j] = 1;
                cnt++;
            }
        }
        ans++;
    }
    cout << ans;
    return 0;
}