題目鏈結
**是帶給大家快樂的存在,而你的目標就是組建若干支樂隊,讓世界聽到你們的演奏!
你目前有 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...