貪心加優先佇列

2021-08-14 01:18:16 字數 1356 閱讀 2454

消滅兔子

李陶冶(命題人)

基準時間限制:1 秒 空間限制:131072 kb 分值: 40

有n只兔子,每只有乙個血量b[i],需要用箭殺死免子。有m種不同型別的箭可以選擇,每種箭對兔子的傷害值分別為d[i],**為p[i](1 <= i <= m)。假設每種箭只能使用一次,每只免子也只能被射一次,計算要消滅地圖上的所有兔子最少需要多少q幣。如不能殺死所有兔子,請輸出no solution。

特別說明:1、當箭的傷害值大於等於兔子的血量時,能將兔子殺死;2、血量b[i],箭的傷害值d[i],箭的**p[i],均小於等於100000。

input

第1行:兩個整數n,m,中間用空格分隔(1 <= n, m <= 50000),分別表示兔子的個數和箭的種類。

第2 - n + 1行:每行1個正整數(共n行),表示兔子的血量b[i](1 <= b[i] <= 100000)。

第n + 2 - n + m + 1行:每行2個正整數(共m行),中間用空格分隔,表示箭所能造成的傷害值d[i],和需要花費的q幣p[i](1 <= d[i], p[i] <= 100000)。

output

輸出最少需要多少q幣才能消滅所有的兔子。如果不能殺死所有兔子,請輸出"no solution"。
input示例

3 312

32 1

3 24 3

output示例

6

#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int maxn=5e4+7;

int b[maxn];

struct node

}a[maxn];

bool cmp1(int a,int b)

bool cmp2(node a,node b)

int main ()

sort(b+1,b+n+1,cmp1);

sort(a+1,a+m+1,cmp2);

priority_queueq;

ll sum=0;int cnt=1;bool flag=true;

for(int i=1;i<=n;i++)

if(q.empty())

sum+=q.top().p;

q.pop();

}if(flag) cout<

else printf("no solution\n");

return 0;

}

多元Huffman編碼問題 貪心加優先佇列

problem description 在乙個操場的四周擺放著n堆石子。現要將石子有次序地合併成一堆。規定每次至少選2 堆最多選k堆石子合併成新的一堆,合併的費用為新的一堆的石子數。試設計乙個演算法,計算出將n堆石子合併成一堆的最大總費用和最小總費用。對於給定n堆石子,計算合併成一堆的最大總費用和最...

優先佇列貪心

最近做了幾個用優先佇列進行貪心的題目,這裡寫下來,以免忘了。1 cf 799 b 每次選最便宜的衣服,沒什麼好說的,一發過 include include include include include define n 6005 define inf 0x3f3f3f3f include incl...

Meteor Flow(貪心 優先佇列)

meteor flow 貪心 優先佇列 ac code 1 既然只要發射一次,就可以打掉,那麼就要打掉那個耗費經歷最多的,以保留更多的精力 所以用優先佇列,先彈出耗費經歷最多的 2 其次,只要有能力打就先不發射 所以先入棧 34 include 5 include 6 include 7 inclu...