問題描述
給定 n 個選手,將他們分成若干只隊伍。其中第 i 個選手要求自己所屬的隊 伍的人數大等於 a[i]人。 在滿足所有選手的要求的前提下,最大化隊伍的總數。 注:每個選手屬於且僅屬於一支隊伍。輸入格式
第一行乙個整數 n,表示人數。 以下 n 行,每行乙個整數表示 a[i]。輸出格式
輸出隊伍總數的最大值。資料保證有解。樣例輸入
5樣例輸出 資料範圍2 1
2 2
3
對於 20%的資料,n <= 10此題容易想成由大到小貪心,但是貪心是錯的,比如1 1 1 6 6 6 6 6 6 6這種資料。對於 40%的資料,n <= 1000
對於 60%的資料,n <= 10000
對於 100%的資料,1 <= n <= 10^6
正解是dp,令f[
i]表示將1−
i 個人分隊的最多分隊數。
容易得到f[
i]=m
ax+1
,j<=i−
a[i]
那麼只需要g[
i]=m
ax,j
<=
i 即可實現o(
n)
**:
#include
#include
#include
#define n 1234567
using
namespace
std;
int n,a[n],f[n],g[n];
int main()
printf("%d",f[n]);
}
洛谷P2062 分隊問題
題目鏈結 一道容易想岔的題.一開始用了貪心的方法先排序後從末尾開始掃瞄陣列.idx的移動規則 移動到i a i 的位置直到將要越界為止.這個思路是有漏洞的,比如說下面這組資料 5 3 3 3 3 3 1 1 這麼貪心輸出的答案是2其實正確的答案是3.因為我們把最後乙個3歸入到第一組裡得到的答案會更好...
jzoj3792,P2062 分隊問題 貪心
題解上說 然而我的貪心不僅a了,而且 反例也a了 n個人,每個人有乙個要求a i 表示他所在的隊伍裡不可以少於a i 個人,然後可以分成求最大的隊伍數量。貪心的思想就是盡量將要求大的人放在一起。所以我們要先排個序,從大到小,然後用乙個now表示當前佇列還需多少個人可以滿足條件 初始 now a 1 ...
HihoCoder 1653 公平分隊
題目 小hi和小ho在玩乙個戰爭遊戲。遊戲中2n個戰鬥單位,其中第i個單位的戰鬥力是ai。現在小hi和小ho要各選n個單位組成隊伍,當然他們都希望自己隊伍的總戰鬥力越大越好。為了使分隊更加公平,經過親切友好的磋商,小hi和小ho達成共識按照以下步驟確定分隊 小ho將2n個單位分成兩隊,每隊n個戰鬥單...