link
在乙個遊戲中,需要在n個士兵中選出一些士兵組成乙個團,第i個士兵的戰力為v[i],團的戰力是團內所有士兵的戰力之和。但是這些士兵有特殊的要求:如果選了第i個士兵,這個士兵希望團的人數不超過s[i]。(如果不選第i個士兵,就沒有這個限制。) 問團的戰力最大為多少。
資料範圍: n(1
≤n≤1
05,1
≤v≤1
09,1
≤s≤n
)n(1≤n≤10^5, 1≤v≤10^9,1≤s≤n)
n(1≤n≤
105,
1≤v≤
109,
1≤s≤
n)若是某個方案選取的其中乙個士兵,其限制為 s
is_i
si, 那麼能達成的最佳方案就是在所有 s 值大於等於 s
is_i
si的士兵中再挑選 si−
1s_i - 1
si−
1個士兵。
可以將士兵按照s值從大到小排序,依次將士兵插入優先佇列中(小頂堆),若是有限佇列的元素個數大於當前士兵的s值,那麼就一直將隊首元素去掉,這樣子的佇列維護即是上述最佳方案的實現,記錄維護過程中的最大值即為所求。
#include
using
namespace std;
typedef
long
long ll;
const
int maxn =
1e5+10;
const
int inf =
0x3f3f3f3f
;struct node
}pro[maxn]
;priority_queue<
int, vector<
int>
, greater<
int>
> que;
int n;
ll ans, cur;
intmain()
ans =
max(ans, cur);}
printf
("%lld\n"
, ans)
;}
貪心演算法牛擠奶 優先佇列解法
有n頭牛 1 n 50,000 要 給定每頭牛 的時間區間a,b。牛需要呆在畜欄裡才能 乙個畜欄同一時間只能容納一頭牛。問至少需要多少個畜欄,才能完成全部 工作,以及每頭牛都放哪個畜欄裡?注意 在同乙個畜欄的兩頭牛,它們 時間區間不能在端點重合。輸入格式 第1行 乙個正整數n 第2 n 1行 第i ...
合併果子(貪心演算法,優先佇列解決)
題目描述 在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過 n 1 次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併...
分配畜欄問題(貪心演算法和優先佇列)
思路如下 先對所有奶牛開始時間排序 然後新開闢乙個畜欄 再怎麼樣至少也有乙個畜欄 每乙個畜欄就是乙個優先佇列,按照結束時間 會場安排 看電影的道理 從小到大排序 判斷奶牛屬於哪乙個畜欄就是看這個奶牛的開始時間與前幾個已經開闢完的畜欄的結束時間比,如果開始時間比結束時間段早,那就再分配新畜欄。如下 i...