對抗女巫的魔法碎片(貪心,排序)

2021-09-30 14:37:56 字數 2120 閱讀 8716

problem description

光明世界的乙個國家發生動盪,女巫利用了**的力量將國家的村莊都施下了咒語,好在國家還有英勇 的士兵,他們正義的力量能夠破解這些魔咒奪回村莊,並且得到魔法碎片,利用足夠多的魔法碎片可以將女巫剷除。

現在己經被魔咒封印的村莊有m個,編號為1到m。英勇的士兵n個,編號從1到n。第i個士兵攻擊力 為ai,第j個村莊防禦力為bj,魔法價值為cj。

現在這些士兵想奪回這些村莊,每個士兵可以最多占領乙個村莊,乙個村莊最多被乙個士兵占領。當士兵的攻擊力ai大於村莊的防禦力bj的時候,該士兵就可以奪回這個村莊,並且士兵會獲得魔法碎片ai−bj+cj 個。

現在想知道這些士兵奪回村莊,獲得的魔法碎片之和最多是多少

input

輸入第一行乙個整數t,表示有t組資料。

接下來一行輸入兩個整數n和m。

接下來一行,輸入n個數ai,表示士兵的攻擊力。

接下來m行,每行輸入兩個數bi,ci,表示村莊的防禦力和該村莊的魔法價值。

1 <= n,m <= 100000

1 <= ai,bi,ci <= 100000

output

乙個整數,表示獲得的魔法碎片的數量

sample input

2

3 34 4 4

2 31 3

5 33 3

4 4 6

2 34 3

5 3

sample output

11

10

感覺是是貪心,先按照村莊的實際價值(本身價值-防禦力)降序排序,那麼我們就想從前到後的盡可能多的攻打這些村莊。

但是因為士兵是有攻擊力這麼一說的,所以我們要盡可能的讓剛好大於村莊防禦力的士兵去攻打,每次都妄圖以最小的代價去獲得最大的利益。這樣,獲取的實際利益最大並且攻打的數量也是最多。

可以用multiset存士兵的攻擊,然後用upper_bound()去找剛好大於防禦力的某個士兵。

最後我們會的到能攻打的村莊的數量,雖然我們在過程中是用最小攻擊力的士兵攻打,但是題目中的利益獲得是士兵的攻擊力高也就越高,所以我們得到數量後,用攻擊力高的士兵去算利益。

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 100010;

int a[maxn]; //士兵

int b[maxn]; //村莊防禦

int c[maxn]; //村莊價值

int d[maxn]; //村莊的索引 新增的時候是從0到m-1 但是會排序 拍的序列就放到d

bool cmp(int i,int j)

int main()

for(int i=0;iscanf("%d %d",&b[i],&c[i]);

d[i] = i; //預設村莊排序從0到m-1

}

sort(a,a+n,greater()); //士兵先按照降序排列

sort(d,d+m,cmp);

//從攻打村莊的價值 從高到低看能攻打多少個

int cnt = 0;

long

long ans = 0;

multiset

::iterator it;

for(int i = 0; i < m; i++)

for(int i=0;i//得到我們最多能攻打的村莊數量,然後讓攻擊力最高的去攻打,獲得最大利益

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

}

return

0; }

碎碎念 廣州的生活

這篇文字或許就是 不知道說點什麼的說點什麼 之前有看過一篇文章,關於如何寫東西的,有句話是,如果你不知道寫什麼,那就 寫上 我不知道寫什麼 哈哈,仔細想來這也不失為乙個辦法,感覺最近 下筆 很糾結啊。來廣州工作快要乙個月了,說說這邊的生活吧 地點 一直在說自己在廣州工作,的確是廣州,不過是廣州 中國...

分分鐘的碎碎念

以前有個孩子,他分分鐘都在碎碎念。不過,他的念頭之間是有因果關係的。他會在本子裡記錄每乙個念頭,並用箭頭畫出這個念頭的 於之前的哪乙個念頭。翻開這個本子,你一定會被互相穿梭的箭頭給攪暈,現在他希望你用程式計算出這些念頭中最長的一條因果鏈。將念頭從1到n編號,念頭i 於念頭from i 保證from ...

我的2020 碎碎念

文章想寫很久了,只是一直有好多事。部落格裡的草稿箱也堆了好幾篇。我不是個善於表達的人,多說多錯,盡量少說。自己非常幸運能去data ies實習。記得剛進部門,我mentor向我宣布,因為工作轉移的原因,我們的一整個業務,目前只有他和我倆人,orz。確實沒人,乙個業務4個模組,mentor乙個人頂了三...