uoj50蘿蔔大作戰(優先佇列)

2021-07-24 13:29:35 字數 1008 閱讀 7604

description

乙隻有追求的兔紙,不應該終日遊戲。於是它參加了乙個名為蘿蔔大戰的遊戲,啊不,比賽。

比賽開始時,場地上有nn個蘿蔔,第ii個蘿蔔具有美味度didi。更加詭異的是,第ii個蘿蔔會在第titi秒末消失。

雖然兔紙每秒至多吃掉11個蘿蔔,但是它仍然急切地想要知道,它能吃掉蘿蔔美味度之和的最大值是多少。

input specification

第 11 行, 11 個整數 nn。

第 22 行到第 n+1n+1 行, 22 個整數di,tidi,ti。

output specification

第 11 行, 11 個整數, 表示美味度之和的最大值。

input and output sample

[input #1]

21 2

2 1[output #1]

3[input #2]

31 2

2 23 1

[output #2]

【思路】一開始想按d的大小排序,用樹狀陣列,每次摘取d最大的蘿蔔,判斷該時間t中摘取的蘿蔔是否超過t個。然而這是錯的,因為每次修改並不是按順序來的,後面的修改不會對前面產生影響,而實際上是會的。

解法1、

按t的值從小到大排序,每次把蘿蔔塞進優先佇列裡,若佇列中蘿蔔個數大於此時的時間限制,讓最小的蘿蔔出隊,此優先佇列即表示該時間t下能塞下的最大的前i(i<=t)個蘿蔔

【**】

#include #include #include #include #include #include #define maxn 1000006

#define ll long long

using namespace std;

struct data

void init()

while(q.size())ans+=q.top(),q.pop();

printf("%lld\n",ans);

}int main()