1191 消滅兔子

2021-08-14 22:39:25 字數 1377 閱讀 1122

有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 #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

typedef pairp;

const int inf = 0x3f3f3f3f;

const ll linf = 0x3f3f3f3f3f3f3f3f;

const double pi = acos(-1.0);

const double eps = 1e-10;

const int maxn = 5e4+7;

const int mod = 1e9+7;

int n,m;

int a[maxn];

struct q

else if(que.size()&&b[que.top().i].q>b[i].q)

}ll ans = 0;

if(que.size()

51NOD 1191 消滅兔子

1191 消滅兔子 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 有n只兔子,每只有乙個血量b i 需要用箭殺死免子。有m種不同型別的箭可以選擇,每種箭對兔子的傷害值分別為d i 為p i 1 i m 假設每種箭只能使用一次,每只免子也只能被射一次,計算要消滅地...

51 Nod 1191消滅兔子

1 秒131,072 kb 40 分 4 級題 有n只兔子,每只有乙個血量b i 需要用箭殺死免子。有m種不同型別的箭可以選擇,每種箭對兔子的傷害值分別為d i 為p i 1 i m 假設每種箭只能使用一次,每只免子也只能被射一次,計算要消滅地圖上的所有兔子最少需要多少q幣。如不能殺死所有兔子,請輸...

1191 消滅兔子(貪心,優先佇列)

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