您的位置:首页 > 其它

Heap:Sunscreen(POJ 3614)

2015-10-27 00:20 309 查看
                


                 晒太阳

  题目大意:一堆牛,为了避免晒太阳会灼烧自己,然后他们自己有自己的防晒指数(一个区间),防晒霜可以提高防晒因数SPF,大了不行小了不行,现在有一桶防晒霜,他们提供一定的SPF,但是最多可以提供k头牛使用,问你这堆防晒霜最多可以给多少头牛提供保护?

  大水题,我们用贪心就可以了,把防晒因数尽量给SPF_MIN大的用(还要比较SPF_MAX满足要求与否),就是建堆,然后不断贪心就可以了。

  

#include <iostream>
#include <functional>
#include <algorithm>
#include <queue>

using namespace std;

typedef struct cow_set_
{
int min_SPF;
int max_SPF;
}COWS;
typedef struct lotion_set_
{
int SPF;
int cover;
bool operator < (const lotion_set_ &x) const //自定义比较函数
{
return SPF < x.SPF;//最大值优先
}
}Lotion;

int fcomp(const void *a, const void *b)
{
if ((*(COWS *)a).min_SPF == (*(COWS *)b).min_SPF)
{
return (*(COWS *)b).max_SPF - (*(COWS *)a).max_SPF;
}
else
return (*(COWS *)b).min_SPF - (*(COWS *)a).min_SPF;//由大到小排列
}

static COWS cows_set[2500];
static bool used[2500];
priority_queue<lotion_set_>que_lotion;

void Search(const int);

int main(void)
{
int cow_sum, lotion_sum;
Lotion tmp;

while (~scanf("%d%d", &cow_sum, &lotion_sum))
{
for (int i = 0; i < cow_sum; i++)
scanf("%d%d", &cows_set[i].min_SPF, &cows_set[i].max_SPF);
for (int i = 0; i < lotion_sum; i++)
{
scanf("%d%d", &tmp.SPF, &tmp.cover);
que_lotion.push(tmp);
}
qsort(cows_set, cow_sum, sizeof(COWS), fcomp);
Search(cow_sum);
}
return 0;
}

void Search(const int cow_sum)
{
int ans = 0, tmp_cover;
Lotion out;
memset(used, 0, sizeof(used));

while (!que_lotion.empty())
{
out = que_lotion.top(); que_lotion.pop();
tmp_cover = out.cover;
for (int j = 0; j < cow_sum && tmp_cover != 0; j++)
{
if (used[j]) continue;
if (cows_set[j].max_SPF < out.SPF
|| cows_set[j].min_SPF > out.SPF)
continue;

used[j] = 1; ans++; tmp_cover--;
}
}
printf("%d\n", ans);
}




还有这一次用了STL的堆,不知道为什么STL的堆总是比我自己手动写的要慢一点,可能是因为STL要先要一片区域的原因
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: