1. 程式人生 > >【日常刷題】搭積木(貪心)

【日常刷題】搭積木(貪心)

宋榮子搭積木

根據題意,你一定很快就能夠想到作為列積木,越下面越大。
其實這個思想對應了一個貪心演算法,我們自然要進行排序。
我們列舉的方式是先列舉頂層的再逐漸向下進行列舉,只要列舉到的能放就放。此時你可以聯絡一下程式碼參考一下具體的思路究竟是怎麼樣的。

#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; }

為什麼可以這麼列舉呢?(顯然) 小的是可以放在大的積木上的,除非因為個數限制。這樣,我們就不斷列舉,能放則放,不能放就再開一列放。就像

導彈攔截開系統的過程一下,都是基於貪心實現的。相比於正序列舉,這種方法顯然是對的,而且便於實現。
灰常敷衍的解釋