版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}
为什么可以这么枚举呢?(显然) 小的是可以放在大的积木上的,除非因为个数限制。这样,我们就不断枚举,能放则放,不能放就再开一列放。就像导弹拦截开系统的过程一下,都是基于贪心实现的。相比于正序枚举,这种方法显然是对的,而且便于实现。
灰常敷衍的解释