牛客 tokitsukaze and Soldier 貪心
牛客 tokitsukaze and Soldier
題意
有 n n n 個士兵,每個士兵有戰鬥力 v v v ,選了這個士兵之後要求最多選 s s s 個士兵,求如何選士兵,使得士兵的戰鬥力總和最大。
題解
可以先把士兵按照 s s s 從大到小排序,那麼對於可選擇的士兵數量的限制就是選擇的最右邊的 s s s ,並且 s s s 遞減,那麼先選擇那個士兵,然後可以在左邊選戰鬥力最大的 s − 1 s-1 s−1 個士兵。
使用優先佇列(小根堆)維護即可,如果當前優先佇列裡的士兵數量大於 s s s ,則要pop戰鬥力最小的士兵。
程式碼
#pragma region
//#pragma optimize("Ofast")
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <vector>
using namespace std;
typedef long long ll;
#define tr t[root]
#define lson t[root << 1]
#define rson t[root << 1 | 1]
#define rep(i, a, n) for (int i = a; i <= n; ++i)
#define per(i, a, n) for (int i = n; i >= a; --i)
#pragma endregion
const int maxn = 1e5 + 5;
struct node {
int v, s;
bool operator<(const node &A) const { return v > A.v; }
} a[maxn];
int main() {
int n;
scanf("%d", &n);
rep(i, 1, n) scanf("%d%d", &a[i].v, &a[i].s);
sort(a + 1, a + 1 + n, [](const node &A, const node &B) {
return A.s > B.s;
});
priority_queue<node> q;
ll ans = 0, tmp = 0;
for (int l = 1, r = 1; l <= n; l = r + 1, r = l) {
while (r + 1 <= n && a[r].s == a[r + 1].s) ++r;
rep(i, l, r) q.push(a[i]), tmp += a[i].v;
while (q.size() > a[r].s) tmp -= q.top().v, q.pop();
ans = max(ans, tmp);
}
printf("%lld\n", ans);
}
相關文章
- 牛客練習賽40 B 小A與任務(貪心)
- 貪心
- 反悔貪心
- Supermarket(貪心)
- 貪心模式記錄模式
- 貪心、構造合集
- 貪心演算法演算法
- 反悔貪心雜題
- Least Cost Bracket Sequence(貪心)ASTRacket
- HDU 4550卡片遊戲(貪心)遊戲
- 24/03/20 貪心(一)
- 7.5 - 貪心篇完結
- 貪心 做題筆記筆記
- 「貪心」做題記錄
- 學一下貪心演算法-學一下貪心演算法演算法
- 貪心演算法(貪婪演算法,greedy algorithm)演算法Go
- HDU 5813 Elegant Construction (貪心)Struct
- 淺談貪心與動歸
- 貪心演算法Dijkstra演算法
- 貪心(入門簡單題)
- 9-貪心演算法演算法
- [反悔貪心] Add One 2
- 牛客周賽48
- Tokitsukaze and Two Colorful Tapes
- 程式猿生存指南-63 貪心姑娘
- 演算法基礎–貪心策略演算法
- Moving Tables(貪心演算法)演算法
- 1413D. Shurikens(貪心,棧)3D
- Leetcode 貪心:差值調整LeetCode
- Python演算法:貪心策略Python演算法
- 一種型別的樹貪心型別
- 靈茶之貪心模擬01
- D. Soldier and Number GameGAM
- 牛客周賽 Round 8
- 牛客周賽Ronud 46
- 牛客周賽 Round 47
- 牛客周賽 Round 40
- 牛客周賽 Round 63