NKOJ 3860 分隊問題(DP 字首和優化)

2021-08-09 18:38:55 字數 1150 閱讀 2069

問題描述

給定 n 個選手,將他們分成若干只隊伍。其中第 i 個選手要求自己所屬的隊 伍的人數大等於 a[i]人。 在滿足所有選手的要求的前提下,最大化隊伍的總數。 注:每個選手屬於且僅屬於一支隊伍。

輸入格式

第一行乙個整數 n,表示人數。 以下 n 行,每行乙個整數表示 a[i]。

輸出格式

輸出隊伍總數的最大值。資料保證有解。

樣例輸入

5

2 1

2 2

3

樣例輸出

資料範圍

對於 20%的資料,n <= 10

對於 40%的資料,n <= 1000

對於 60%的資料,n <= 10000

對於 100%的資料,1 <= n <= 10^6

此題容易想成由大到小貪心,但是貪心是錯的,比如1 1 1 6 6 6 6 6 6 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個戰鬥單...