P2816 宋荣子搭积木

描述:https://www.luogu.com.cn/problem/P2816

saruka非常喜欢搭积木,他一共有n块积木。而且saruka的积木很特殊,只能一块块的竖着摞,可以摞很多列。说过saruka的是特殊的积木了,这些积木都非常智能,第i块积木有一个情绪值xi,当摞在这块积木上的积木总数超过xi时,这块积木就会很不高兴,发誓以后不会再和saruka一起玩耍了。saruka这么爱玩积木,肯定不会让积木不高兴的,但是saruka又希望每块积木都被用上,并且摞的积木列数最少。你能来帮帮saruka嘛?


考虑我们已经堆好了3列积木,现在来了一个新积木

我们该把它放在哪一列呢?

堆在上面是不好考虑的,因为我们不知道下面的积木是不是承受的了重量

所以我们考虑每次把新来的积木放在每一列的最下面

在放的下的前提下,我们尽量放在积木数最多的那一列下

因为后续的积木可能不能放在这一列(承受重量属性比较低)

比如原来是2,3,5,再放肯定要放在5的底下,变成2,3,6。对于后续的决策来说,2,3,6肯定比3,3,5或者2,4,5优。

那么我们先把积木从小到大排序

Ⅰ能放下的话,挑最高的积木那一列放

Ⅱ放不下的话,新开一列

#include <bits/stdc++.h>
using namespace std;
int n;
int a[5009],f=1,w[5009];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)    cin>>a[i];
    sort(a+1,a+1+n);
    w[1]=1;
    for(int i=2;i<=n;i++)
    {
        int flag=0;
        for(int j=1;j<=f;j++)
        {
            if(a[i]>=w[j])
            {
                flag=1;
                w[j]++;
                break;
            }
        }
        if(!flag){
            f++;
            w[f]++;
        }
    }
    cout<<f;
}
原文地址:https://www.cnblogs.com/iss-ue/p/12536924.html