【日常刷题】搭积木(贪心)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Ronaldo7_ZYB/article/details/83150921

宋荣子搭积木

根据题意,你一定很快就能够想到作为列积木,越下面越大。
其实这个思想对应了一个贪心算法,我们自然要进行排序。
我们枚举的方式是先枚举顶层的再逐渐向下进行枚举,只要枚举到的能放就放。此时你可以联系一下代码参考一下具体的思路究竟是怎么样的。

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

int n,ans=0;

int i,j;
int mood[MAXN];
int used[MAXN];

inline void read(int &be_readNUM)
{
    int s=0,w=1;char c=getchar();
    while (c<'0' || c>'9') c=getchar();
    while (c<='9' && c>='0') {s=s*10+c-'0'; c=getchar();}
    be_readNUM=s*w;return;
}

int main()
{
    read(n);
    for (i=1;i<=n;++i) read(mood[i]);
    sort(mood+1,mood+n+1);
    for (i=1;i<=n;++i)
    {
        if (used[i]) continue;
        ++ans;
        used[i]=1;
        int sum=1;
        for (j=i+1;j<=n;++j)
            if (sum<=mood[j] && !used[j])
            {
                ++sum;
                used[j]=1;
            }
    }
    printf("%d",ans);
    return 0;
}

为什么可以这么枚举呢?(显然) 小的是可以放在大的积木上的,除非因为个数限制。这样,我们就不断枚举,能放则放,不能放就再开一列放。就像导弹拦截开系统的过程一下,都是基于贪心实现的。相比于正序枚举,这种方法显然是对的,而且便于实现。
灰常敷衍的解释

猜你喜欢

转载自blog.csdn.net/Ronaldo7_ZYB/article/details/83150921
今日推荐