日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【POJ 3614 Sunscreen】贪心 优先级队列

發(fā)布時(shí)間:2025/3/17 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【POJ 3614 Sunscreen】贪心 优先级队列 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接:http://poj.org/problem?id=3614

題意:C頭牛去曬太陽(yáng),每頭牛有自己所限定的spf安全范圍[min, max];有L瓶防曬液,每瓶有自己的spf值和容量(能供幾頭牛用)。

求這L瓶防曬液最多能讓多少頭牛安全地曬太陽(yáng)。

思路:貪心策略,按spf從小到大或從大到小的順序取出防曬液,供給盡可能多的剩余的牛。

具體如何判斷當(dāng)前這瓶防曬液最多能供給幾頭牛呢?

以spf從小到大排序所有防曬液為例,可以維護(hù)一個(gè)小頂堆,每取出一瓶防曬液l,就把剩余的所有min值低于l.spf的牛的max值放入堆中。

接下來在l的容量尚未耗盡時(shí),反復(fù)彈出并比較堆頂值與l.spf,若大于l.spf,則 l 消耗1單位的容量供給這頭牛,計(jì)數(shù)值加1;否則這頭牛不能被任何防曬液供給(當(dāng)前spf已經(jīng)是剩余的最小值,后續(xù)不會(huì)有更小的)。反復(fù)取堆頂元素直至容量耗盡或堆變空。各瓶防曬液的計(jì)數(shù)值的總和即為答案。

首先需要將防曬液按spf值從小大到排序(O(LlogL)),以及將牛按min值從小到大排序(O(ClogC));然后外層循環(huán)對(duì)L瓶防曬液進(jìn)行一遍掃描(O(L)),內(nèi)層循環(huán)每頭牛的max必然入堆一次、彈出一次(Ω(C)),所以總的復(fù)雜度為O(LlogL + CLogC + LC)。

自己實(shí)現(xiàn)的堆,時(shí)間上總是比STL的priority_queue慢一些,不過空間更少。

1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 const int MAX_C = 2505; 5 const int MAX_L = 2505; 6 int C, L; 7 struct Cow 8 { 9 int min, max; 10 Cow& operator = (Cow& c){ 11 min = c.min; 12 max = c.max; 13 return *this; 14 } 15 }cows[MAX_C]; 16 17 struct Lotion 18 { 19 int spf,cover; 20 }lotions[MAX_C]; 21 22 bool cmpL(Lotion l1, Lotion l2){ 23 return l1.spf < l2.spf; 24 } 25 bool cmpC(Cow c1, Cow c2){ 26 return c1.min < c2.min; 27 } 28 29 int heap[MAX_C]; //小頂堆 30 int size = 0; 31 32 void swap(int& x, int& y){ 33 int tmp = x; 34 x = y; 35 y = tmp; 36 } 37 38 void insert(int x){ 39 size++; 40 heap[size-1] = x;//目標(biāo)元素暫時(shí)插到末尾 41 int i = size - 1;//候選目標(biāo)位置 42 while(i > 0){ //上濾,反復(fù)與父節(jié)點(diǎn)比較 43 int p = (i-1)/2; 44 if(heap[p] > heap[i]){//與父節(jié)點(diǎn)違反堆序性時(shí) 45 swap(heap[i], heap[p]);//父節(jié)點(diǎn)下沉 46 i = p; //候選位置攀升 47 }else break; 48 } 49 } 50 51 void deleteTop(){ 52 heap[0] = heap[size-1]; 53 size--; 54 int i = 0; //候選目標(biāo)位置 55 while(i*2+1 < size){//下濾 56 int lc = i*2+1; 57 int rc = i*2+2; 58 int c = lc; 59 if(rc<size && heap[rc]<heap[lc]) 60 c = rc; 61 if(heap[c] < heap[i]){ 62 swap(heap[c], heap[i]);//孩子節(jié)點(diǎn)攀升 63 i = c;//候選位置下沉 64 }else break; 65 } 66 } 67 68 int getTop(){ 69 return heap[0]; 70 } 71 72 int main() 73 { 74 freopen("3614.txt", "r", stdin); 75 scanf("%d%d", &C, &L); 76 for(int i=0; i<C; i++){ 77 scanf("%d%d", &cows[i].min, &cows[i].max); 78 } 79 80 for(int i=0; i<L; i++){ 81 scanf("%d%d", &lotions[i].spf, &lotions[i].cover); 82 } 83 84 sort(lotions, lotions+L, cmpL); 85 sort(cows, cows+C, cmpC); 86 87 int cnt = 0; 88 for(int i=0, j=0; i<L; i++){ 89 //printf("lotion %d %d\n", lotions[i].spf, lotions[i].cover); 90 while(j<C && cows[j].min <= lotions[i].spf){ 91 insert(cows[j].max); 92 j++; 93 //printf("insert %d\n", cows[j-1].max); 94 } 95 int vol = lotions[i].cover; 96 97 while(vol > 0 && size>0){ 98 if(getTop() >= lotions[i].spf){ 99 vol--; 100 cnt++; 101 //printf("add %d\n", getTop()); 102 } 103 deleteTop(); 104 //printf("%d\n", cnt); 105 } 106 } 107 printf("%d\n", cnt); 108 return 0; 109 }

?

總結(jié)

以上是生活随笔為你收集整理的【POJ 3614 Sunscreen】贪心 优先级队列的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。