1. 程式人生 > >POJ3614與優先佇列

POJ3614與優先佇列

題意:
奶牛晒太陽,有下限和上限,要保證晒到上下限之間,每瓶防晒霜可以固定一頭奶牛晒到一個固定值,求最多幾頭奶牛可以達到要求

要點;
先把奶牛按照最小值從小到大排序,在把防晒霜從小到大排序,從最小的防晒霜列舉,如果大於奶牛的最小值就把奶牛的最大值放入優先數列(從小到大),這樣的話每次只要比較優先數列的第一項與奶牛的最大值就可以了。這裡面也有貪心的思想,每次防晒霜優先塗最大值比較小的奶牛。

程式碼如下:

#include <iostream>  
#include <algorithm>  
#include <cstring>  
#include <cstdio>  
#include <map> #include <vector> #include <queue> #define maxn 3000 using namespace std; struct node { int min; int max; }; node cow[maxn], bot[maxn]; bool cmp(node a, node b) { if (a.min == b.min) return a.max < b.max; //bool型這裡一定要用<,不能用- return a.min < b.min; } struct
cmp_temp //結構體控制優先佇列小的數優先度高 { bool operator()(int x, int y) { return x > y; //注意這裡是大於 } }; priority_queue<int, vector<int>, cmp_temp>que; //優先佇列的定義函式宣告 int main() { int c, l, i, j, cur, ans; while (scanf("%d%d", &c, &l) != EOF) { for
(i = 0; i < c; i++) scanf("%d%d", &cow[i].min, &cow[i].max); for (i = 0; i < l; i++) scanf("%d%d", &bot[i].min, &bot[i].max); sort(cow, cow + c, cmp); sort(bot, bot + l, cmp); //先從小到大排序 cur = ans = 0; for (i = 0; i < l; i++) { while (cur<c&&cow[cur].min <= bot[i].min) { que.push(cow[cur].max); //將符合條件的奶牛的最大值放入優先佇列 cur++; } while (bot[i].max&&que.size())//確保防晒霜沒用完 { if (bot[i].min <= que.top()) { ans++; bot[i].max--; //防晒霜瓶數-1 } que.pop();//不管符不符合佇列中都有一個元素出隊 } } printf("%d\n", ans); } return 0; }

心得:
優先數列感覺就是一個已經封裝好的函式,你把資料放進去會自動幫你排好序,用的時候呼叫就可以了,好像是用堆來實現的,按最小和最大的好像跟堆一模一樣,但如果按其他的(比如按個位數大小之類的)就不知道了