牛客小白月賽27 B 樂團派對

2021-10-23 17:03:16 字數 1986 閱讀 3771

題目鏈結

**是帶給大家快樂的存在,而你的目標就是組建若干支樂隊,讓世界聽到你們的演奏!

你目前有 n

nn 位樂手,每位樂手只能進入乙個樂隊,但並不是每位樂手都能擔大任,因此需要團隊合作。第ii位樂手的能力值為 a[i

]a[i]

a[i]

,表示該位樂手所在樂隊的人數必須大於等於 a[i

]a[i]

a[i]

。在保證每位樂手都被分進乙個樂隊的情況下,樂隊數量最多可以是多少?

第一行乙個正整數 n

nn,表示樂手人數,n≤1

05

n\leq10^

n≤105。

第二行 n

nn 個正整數 a[i

]a[i]

a[i]

,表示每位樂手的能力值,a[i

]≤10

9a[i]\leq10^

a[i]≤1

09。輸出最多的樂隊數量。若無法保證每位樂手都被分進乙個樂隊,則輸出 −1-1

−1。

4

2 1 2 1

3
首先這題的出處在這裡 codeforces round #643 (div. 2) b.young explorers

由於我之前做過了,所以很快就找到了原題,但是很遺憾,這題是修改過的,原題是不要求所有人都分組求最大組數,而這題的要求所有人都要分組求最大組數,那麼我們必須從大往小挑,對某乙個位置 i

ii,如果 a[i

]>

ia[i]>i

a[i]

>

i,那麼肯定輸出 −1-1

−1,如果 a[i

]≤

ia[i]\leq i

a[i]≤i

,就把 i−=

a[i]

i-=a[i]

i−=a[i

],直到 i=1

i=1i=

1 為止,這樣一來很多人都覺得沒問題了,其實還有乙個坑點,比如:

322

2

照上面的分法就是輸出 −1-1

−1,其實答案是 1

11,不難發現,當 i

ii 減小後,如果出現 a[i

]>

ia[i]>i

a[i]

>

i,那麼此時的 a[i

]a[i]

a[i]

7

4 4 4 4 3 1 1

如果按我的分答案就是 2

22,如果把 3

33 劃分到上一組可以得到 3

33 組,後來看了題解,這題只能用 dp 解決,我們先對a陣列從小到大排序,設 dp[

i]

dp[i]

dp[i

] 為前 i

ii 個樂手最多能組成的樂隊個數,那麼有轉移方程:

① i=a[i],dp[i]=max(dp[i-a[i]], dp[i-a[i]-1], …,dp[0])+1

所以我們邊轉移邊維護乙個字首max陣列,即可線性求出 dp[

n]

dp[n]

dp[n

]。最後看 dp[

n]

dp[n]

dp[n

] 是否為 0,若為 0 則輸出 -1,否則輸出 dp[

n]

dp[n]

dp[n]。

#include

using

namespace std;

typedef

long

long ll;

const

int n=

1e5+5;

int n,a[n]

,mx[n]

,ans;

main()

cout<<

(ans?ans:-1

);}

牛客小白月賽27 樂團派對

時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 是帶給大家快樂的存在,而你的目標就是組建若干支樂隊,讓世界聽到你們的演奏!你目前有nn位樂手,每位樂手只能進入乙個樂隊,但並不是每位樂手都能擔大任,因此需要團隊合作...

牛客小白月賽4 20180616B

鐵子和順溜在學習了博弈論的sg函式之後,解決了很多很多博弈題,現在他們遇到了一道難題。給出乙個長度為 n 的數列,數列裡的每個元素都是個位數,這個數列的每乙個連續子數列都能生成,乙個十進位制數,對於子數列a l r 這個十進位制數的個位為a r 十位為a r 1 最高位,為a l 現在鐵子需要知道最...

牛客 2020 11 14牛客小白月賽29 B

by 041 本人原文 簡單的說,對於乙個bool量x x 1 x x 0 0 x 1 1 x 0 x x 1 x x 0 x 所以,對於每一次操作,在有影響 上面的2 3 5三種情況 到的位置加入相應操作的標記最後整合就行 對於第i位 0的操作 清空之前該位置所有的操作,加上標記1 對於第i位 1...