51nod 消滅兔子

2022-05-20 07:43:23 字數 1711 閱讀 6358

消滅兔子

李陶冶(命題人)

基準時間限制: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
c++的執行時限為:1000 ms ,空間限制為:131072 kb 示例及語言說明請按這裡

發現我貪心的題都不是很會搞

果然是我太蠢啊

剛開始想的時候有想過貪心

但是沒認真想

想用費用流(限制一下流量為1)

發現資料太大跑不過

再講一下貪心

將兔子從大到小排序

箭按傷害也從大到小排序

然後開始乙個乙個兔子選

把能殺死他的箭都丟進優先順序為費用的小根堆裡(優先佇列)

然後就選堆頂啦

證明一下嘍

要保證全部兔子都被殺死嘛

所以如果從小的兔子開始殺的話,大的就不一定殺得死了

然後對於每乙隻兔子都是費用最小的嘛

而且能殺死大的,就肯定能殺死小的

所以就從大到小乙隻乙隻選就好啦

據說還有一種貪心策略

也是要箭從小到大排序

剛開始不用考慮費用

先把全部兔子都殺死

然後如果還有剩箭的話就拿費用小的去替換掉費用大的(由於從小到大排序,所以一定殺得死)

也不錯啊

上**:

#include#include#includeconst int n=50005;

int b[n];

struct node

e[n];

struct edgt

};bool cmp1(node a,node b)

bool cmp2(int a,int b)

std::priority_queueq;

int main()

),cnt++;

if(!q.empty())

else

}printf("%d\n",sum);

return 0;

}

51Nod 消滅兔子 (優先佇列)

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

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幣。如不能殺死所有兔子,請輸...