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乙個人頂了三...