【日常刷題】搭積木(貪心)
阿新 • • 發佈:2018-11-08
宋榮子搭積木
根據題意,你一定很快就能夠想到作為列積木,越下面越大。
其實這個思想對應了一個貪心演算法,我們自然要進行排序。
我們列舉的方式是先列舉頂層的再逐漸向下進行列舉,只要列舉到的能放就放。此時你可以聯絡一下程式碼參考一下具體的思路究竟是怎麼樣的。
#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;
}
為什麼可以這麼列舉呢?(顯然) 小的是可以放在大的積木上的,除非因為個數限制。這樣,我們就不斷列舉,能放則放,不能放就再開一列放。就像 導彈攔截開系統的過程一下,都是基於貪心實現的。相比於正序列舉,這種方法顯然是對的,而且便於實現。
灰常敷衍的解釋