hdu4544 优先队列(小贪心)
生活随笔
收集整理的這篇文章主要介紹了
hdu4544 优先队列(小贪心)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意:
? ? ? ? ? ? ? ? 湫湫系列故事——消滅兔子
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Total Submission(s): 1539 Accepted Submission(s): 525
Problem Description 湫湫減肥
越減越肥!
最近,減肥失敗的湫湫為發(fā)泄心中郁悶,在玩一個(gè)消滅免子的游戲。
游戲規(guī)則很簡單,用箭殺死免子即可。
箭是一種消耗品,已知有M種不同類型的箭可以選擇,并且每種箭都會(huì)對兔子造成傷害,對應(yīng)的傷害值分別為Di(1 <= i <= M),每種箭需要一定的QQ幣購買。
假設(shè)每種箭只能使用一次,每只免子也只能被射一次,請計(jì)算要消滅地圖上的所有兔子最少需要的QQ幣。
Input 輸入數(shù)據(jù)有多組,每組數(shù)據(jù)有四行;
第一行有兩個(gè)整數(shù)N,M(1 <= N, M <= 100000),分別表示兔子的個(gè)數(shù)和箭的種類;
第二行有N個(gè)正整數(shù),分別表示兔子的血量Bi(1 <= i <= N);
第三行有M個(gè)正整數(shù),表示每把箭所能造成的傷害值Di(1 <= i <= M);
第四行有M個(gè)正整數(shù),表示每把箭需要花費(fèi)的QQ幣Pi(1 <= i <= M)。
特別說明:
1、當(dāng)箭的傷害值大于等于兔子的血量時(shí),就能將兔子殺死;
2、血量Bi,箭的傷害值Di,箭的價(jià)格Pi,均小于等于100000。
Output 如果不能殺死所有兔子,請輸出”No”,否則,請輸出最少的QQ幣數(shù),每組輸出一行。
Sample Input 3 3 1 2 3 2 3 4 1 2 3 3 4 1 2 3 1 2 3 4 1 2 3 1
Sample Output 6 4
思路:
? ? ? ?這個(gè)題目比較好想,顯然是個(gè)小貪心,首先我們先出路血最多的兔子,對于血最多的兔子我們只要在能殺死他的劍里面選一個(gè)最便宜的就行了,然后在殺血第二多的,以此類推,如果發(fā)現(xiàn)殺某一個(gè)兔子的時(shí)候沒有劍可用了,那么就直接on了,先選血多的兔子是為了防止選擇少的時(shí)候選擇了價(jià)錢少而忘記了首先要保證所有兔子被殺死,直接模擬會(huì)TLE的,我用的優(yōu)先隊(duì)列(別的容器什么的也可以只要?jiǎng)eN^2就行了),先把所有的兔子和劍放在一起排序,遇到劍就把他的攻擊存進(jìn)隊(duì)列里,遇到兔子就取一個(gè)之前qq幣最少的,不用考慮是否能殺死,排序后后面的兔子肯定會(huì)被前面的劍殺死,還多就是注意一下數(shù)據(jù)的大小,一開始開了個(gè)int的ans,wa了一次。
#include<stdio.h> #include<queue> #include<algorithm>#define N 222222 using namespace std;typedef struct NODE {__int64 hp ,cost; }NODE;typedef struct A {__int64 x;friend bool operator < (A x ,A y){return x.x > y.x;} }A;A xin ,tou;NODE node[N];bool camp(NODE a ,NODE b) {return a.hp > b.hp || a.hp == b.hp && a.cost > b.cost; }int main () {int n ,m ,i;__int64 num;while(~scanf("%d %d" ,&n ,&m)){for(i = 1 ;i <= n ;i ++){scanf("%I64d" ,&node[i].hp);node[i].cost = -1;}for(i = 1 ;i <= m ;i ++)scanf("%I64d" ,&node[i+n].hp);for(i = 1 ;i <= m ;i ++)scanf("%I64d" ,&node[i+n].cost);sort(node + 1 ,node + n + m + 1 ,camp);priority_queue<A>q;__int64 ans = 0; for(i = 1 ;i <= n + m ;i ++){if(node[i].cost != -1){xin.x = node[i].cost;q.push(xin);}else{if(q.empty()){ans = -1;break; }tou = q.top();q.pop();ans += tou.x;}}ans == -1 ? puts("No") : printf("%I64d\n" ,ans);}return 0; }
總結(jié)
以上是生活随笔為你收集整理的hdu4544 优先队列(小贪心)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu4179 限制最短路
- 下一篇: hdu3329 二分+搜索