[POJ1456]Supermarket(贪心 + 优先队列 || 并查集)

Posted 蒟蒻zht的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[POJ1456]Supermarket(贪心 + 优先队列 || 并查集)相关的知识,希望对你有一定的参考价值。

传送门

 

1.贪心 + 优先队列

按照时间排序从前往后

很简单不多说

——代码

技术分享
 1 #include <queue>
 2 #include <cstdio>
 3 #include <iostream>
 4 #include <algorithm>
 5 #define N 10001
 6 
 7 int n, t, ans;
 8 std::priority_queue <int, std::vector <int>, std::greater <int> > q;
 9 
10 struct node
11 {
12     int a, b;
13 }p[N];
14 
15 inline int read()
16 {
17     int x = 0, f = 1;
18     char ch = getchar();
19     for(; !isdigit(ch); ch = getchar()) if(ch == -) f = -1;
20     for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - 0;
21     return x * f;
22 }
23 
24 inline bool cmp(node x, node y)
25 {
26     return x.b < y.b;
27 }
28 
29 int main()
30 {
31     int i, j;
32     while(~scanf("%d", &n))
33     {
34         t = 1;
35         ans = 0;
36         while(!q.empty()) q.pop();
37         for(i = 1; i <= n; i++) p[i].a = read(), p[i].b = read();
38         std::sort(p + 1, p + n + 1, cmp);
39         for(i = 1; i <= n; i++)
40         {
41             if(t <= p[i].b)
42             {
43                 t++;
44                 ans += p[i].a;
45                 q.push(p[i].a);
46             }
47             else if(t == p[i].b + 1 && q.top() < p[i].a)
48             {
49                 ans += p[i].a - q.top();
50                 q.pop();
51                 q.push(p[i].a);
52             }
53         }
54         printf("%d\n", ans);
55     }
56     return 0;
57 }
View Code

 

2.并查集

很难想

按照价格从大到小排序

如果当前的那一天没有被占用,那么就用当前那一天,如果当前那一天被占用了,就用上一天,如果还被占用,再往前

其实这就是暴力过程

可以用并查集优化,当前天被占用时用并查集连接上一天,如果根指向0,就表明前面的天都被占用了,也就不用加

具体看代码

——代码

技术分享
 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 #define N 10001
 5 
 6 int n, ans;
 7 int f[N];
 8 
 9 struct node
10 {
11     int a, b;
12 }p[N];
13 
14 inline bool cmp(node x, node y)
15 {
16     return x.a > y.a;
17 }
18 
19 inline int find(int x)
20 {
21     return x == f[x] ? x : f[x] = find(f[x]);
22 }
23 
24 inline int read()
25 {
26     int x = 0, f = 1;
27     char ch = getchar();
28     for(; !isdigit(ch); ch = getchar()) if(ch == -) f = -1;
29     for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - 0;
30     return x * f;
31 }
32 
33 int main()
34 {
35     int i, x;
36     while(~scanf("%d", &n))
37     {
38         ans = 0;
39         for(i = 1; i < N; i++) f[i] = i;
40         for(i = 1; i <= n; i++) p[i].a = read(), p[i].b = read();
41         std::sort(p + 1, p + n + 1, cmp);
42         for(i = 1; i <= n; i++)
43         {
44             x = find(p[i].b);
45             if(x)
46             {
47                 f[x] = x - 1;
48                 ans += p[i].a;
49             }
50         }
51         printf("%d\n", ans);
52     }
53     return 0;
54 }
View Code

 

以上是关于[POJ1456]Supermarket(贪心 + 优先队列 || 并查集)的主要内容,如果未能解决你的问题,请参考以下文章

POJ1456 Supermarket —— 贪心 + 路径压缩优化

POJ 1456 Supermarket (贪心+并查集优化)

Supermarket超市(贪心算法 优先队列)- POJ 1456

POJ 1456 acwing 145 Supermarket [贪心+并查集]

POJ-1456 Supermarket贪心+并查集

POJ 1456 Supermarket(贪心+并查集)