POJ3614與優先佇列
阿新 • • 發佈:2019-01-07
題意:
奶牛晒太陽,有下限和上限,要保證晒到上下限之間,每瓶防晒霜可以固定一頭奶牛晒到一個固定值,求最多幾頭奶牛可以達到要求
要點;
先把奶牛按照最小值從小到大排序,在把防晒霜從小到大排序,從最小的防晒霜列舉,如果大於奶牛的最小值就把奶牛的最大值放入優先數列(從小到大),這樣的話每次只要比較優先數列的第一項與奶牛的最大值就可以了。這裡面也有貪心的思想,每次防晒霜優先塗最大值比較小的奶牛。
程式碼如下:
#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;
}
心得:
優先數列感覺就是一個已經封裝好的函式,你把資料放進去會自動幫你排好序,用的時候呼叫就可以了,好像是用堆來實現的,按最小和最大的好像跟堆一模一樣,但如果按其他的(比如按個位數大小之類的)就不知道了