hdu 4544 消滅兔子

2022-05-03 13:45:25 字數 1663 閱讀 3581

遊戲規則很簡單,用箭殺死免子即可。 

箭是一種消耗品,已知有m種不同型別的箭可以選擇,並且每種箭都會對兔子造成傷害,對應的傷害值分別為di(1 <= i <= m),每種箭需要一定的qq幣購買。 

假設每種箭只能使用一次,每只免子也只能被射一次,請計算要消滅地圖上的所有兔子最少需要的qq幣。 

input輸入資料有多組,每組資料有四行; 

第一行有兩個整數n,m(1 <= n, m <= 100000),分別表示兔子的個數和箭的種類; 

第二行有n個正整數,分別表示兔子的血量bi(1 <= i <= n); 

第三行有m個正整數,表示每把箭所能造成的傷害值di(1 <= i <= m); 

第四行有m個正整數,表示每把箭需要花費的qq幣pi(1 <= i <= m)。 

特別說明: 

1、當箭的傷害值大於等於兔子的血量時,就能將兔子殺死; 

2、血量bi,箭的傷害值di,箭的**pi,均小於等於100000。output如果不能殺死所有兔子,請輸出」no」,否則,請輸出最少的qq幣數,每組輸出一行。sample input

3 3

1 2 3

2 3 4

1 2 3

3 41 2 3

1 2 3 4

1 2 3 1

sample output

6

4題目思路很簡單,也很容易想到解題策略

分析:將兔子血量降序排序,,將箭的傷害值公升序排序,叢箭的傷害值高的地方遍歷,找出能夠殺死此兔子的箭,分別將箭的qq幣放入從小到大排序的優先佇列,利用k遍歷有效的防止重複使用箭,

1 #include2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;

8const

int maxn = 1e5+10;9

#define ll long long

10struct

nodeb[maxn];

1314 inline bool cmp1(int x,int

y)17

bool

cmp(node t1, node t2)

20 priority_queue,greater >q;

21int

main()

31for( int i=0; i)

34for( int i=0; i)

37if(n>m)

41 sort(a,a+n,cmp1);//

將兔子血量與箭的傷害值排下序

42 sort(b,b+m,cmp);

4344

int k=m-1;45

for( int i=0; i//

對於每只兔子

46while(k>=0&&b[k].x>=a[i])

50if

(q.empty())

54 ans+=q.top();

55q.pop();56}

57if(!flag)

58 cout59else

60 cout<<"no"

<6162}63

return0;

64}65

HDU 4544 消滅兔子

問題描述 湫湫 越減越肥!最近,失敗的湫湫為發洩心中鬱悶,在玩乙個消滅免子的遊戲。遊戲規則很簡單,用箭殺死免子即可。箭是一種消耗品,已知有m種不同型別的箭可以選擇,並且每種箭都會對兔子造成傷害,對應的傷害值分別為di 1 i m 每種箭需要一定的qq幣購買。假設每種箭只能使用一次,每只免子也只能被射...

HDU4544 湫湫系列故事 消滅兔子

hdu 4544 tags 資料結構,貪心 analysis 將兔子的血量從大到小排序,將箭的殺傷力從大到小排序,對於每乙個兔子血量,將比他大的殺傷力大的劍壓入優先佇列,優先佇列自己重寫,讓它每次丟擲的數為價錢最小。code include include include include using...

hdu 4544 湫湫系列故事 消滅兔子

湫湫 越減越肥!最近,失敗的湫湫為發洩心中鬱悶,在玩乙個消滅免子的遊戲。遊戲規則很簡單,用箭殺死免子即可。箭是一種消耗品,已知有m種不同型別的箭可以選擇,並且每種箭都會對兔子造成傷害,對應的傷害值分別為di 1 i m 每種箭需要一定的qq幣購買。假設每種箭只能使用一次,每只免子也只能被射一次,請計...