Heap:Sunscreen(POJ 3614)

                

                 晒太阳

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

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

  

 1 #include <iostream>
 2 #include <functional>
 3 #include <algorithm>
 4 #include <queue>
 5 
 6 using namespace std;
 7 
 8 typedef struct cow_set_
 9 {
10     int min_SPF;
11     int max_SPF;
12 }COWS;
13 typedef struct lotion_set_
14 {
15     int SPF;
16     int cover;
17     bool operator < (const lotion_set_ &x) const //自定义比较函数
18     {
19         return SPF < x.SPF;//最大值优先
20     }
21 }Lotion;
22 
23 int fcomp(const void *a, const void *b)
24 {
25     if ((*(COWS *)a).min_SPF == (*(COWS *)b).min_SPF)
26     {
27         return (*(COWS *)b).max_SPF - (*(COWS *)a).max_SPF;
28     }
29     else
30         return (*(COWS *)b).min_SPF - (*(COWS *)a).min_SPF;//由大到小排列
31 }
32 
33 static COWS cows_set[2500];
34 static bool used[2500];
35 priority_queue<lotion_set_>que_lotion;
36 
37 void Search(const int);
38 
39 int main(void)
40 {
41     int cow_sum, lotion_sum;
42     Lotion tmp;
43 
44     while (~scanf("%d%d", &cow_sum, &lotion_sum))
45     {
46         for (int i = 0; i < cow_sum; i++)
47             scanf("%d%d", &cows_set[i].min_SPF, &cows_set[i].max_SPF);
48         for (int i = 0; i < lotion_sum; i++)
49         {
50             scanf("%d%d", &tmp.SPF, &tmp.cover);
51             que_lotion.push(tmp);
52         }    
53         qsort(cows_set, cow_sum, sizeof(COWS), fcomp);
54         Search(cow_sum);
55     }
56     return 0;
57 }
58 
59 void Search(const int cow_sum)
60 {
61     int ans = 0, tmp_cover;
62     Lotion out;
63     memset(used, 0, sizeof(used));
64 
65     while (!que_lotion.empty())
66     {
67         out = que_lotion.top(); que_lotion.pop();
68         tmp_cover = out.cover;
69         for (int j = 0; j < cow_sum && tmp_cover != 0; j++)
70         {
71             if (used[j]) continue;
72             if (cows_set[j].max_SPF < out.SPF
73                 || cows_set[j].min_SPF > out.SPF)
74                 continue;
75 
76             used[j] = 1; ans++; tmp_cover--;
77         }
78     }
79     printf("%d
", ans);
80 }

还有这一次用了STL的堆,不知道为什么STL的堆总是比我自己手动写的要慢一点,可能是因为STL要先要一片区域的原因

原文地址:https://www.cnblogs.com/Philip-Tell-Truth/p/4912943.html