poj 1862 Stripies/优先队列

原题链接:http://poj.org/problem?id=1862

简单题,贪心+优先队列主要练习一下stl大根堆

写了几种实现方式写成类的形式还是要慢一些。。。

手打的heap:

1:

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cmath>
 4 #include<iostream>
 5 class Solution{
 6 public:
 7     static const int Max_N = 110;
 8     int sz;
 9     double heap[Max_N];
10     inline void init(){
11         sz = 0;
12     }
13     inline void push(double x){
14         int i = sz++;
15         while (i > 0){
16             int p = (i - 1) >> 1;
17             if (heap[p] >= x) break;
18             heap[i] = heap[p];
19             i = p;
20         }
21         heap[i] = x;
22     }
23     inline double pop(){
24         double ret = heap[0], x = heap[--sz];
25         int i = 0;
26         while ((i << 1) + 1 < sz){
27             int a = (i << 1) + 1, b = (i << 1) + 2;
28             if (b < sz && heap[a] <= heap[b]) a = b;
29             if (heap[a] <= x) break;
30             heap[i] = heap[a];
31             i = a;
32         }
33         heap[i] = x;
34         return ret;
35     }
36 };
37 int main(){
38 #ifdef LOCAL
39     freopen("in.txt", "r", stdin);
40     freopen("out.txt", "w+", stdout);
41 #endif
42     int n;
43     double a, b;
44     Solution ans;
45     ans.init();
46     scanf("%d", &n);
47     while (n--){
48         scanf("%lf", &a);
49         ans.push(a);
50     }
51     while (ans.sz > 1){
52         a = ans.pop(), b = ans.pop();
53         ans.push(2 * sqrt(a * b));
54     }
55     printf("%.3lf", ans.pop());
56     return 0;
57 }
View Code

2:

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cmath>
 4 #include<iostream>
 5 struct Node{
 6     static const int Max_N = 110;
 7     int sz;
 8     double heap[Max_N];
 9     Node() :sz(0){}
10     inline void push(double x){
11         int i = sz++;
12         while (i > 0){
13             int p = (i - 1) >> 1;
14             if (heap[p] >= x) break;
15             heap[i] = heap[p];
16             i = p;
17         }
18         heap[i] = x;
19     }
20     inline double pop(){
21         double ret = heap[0], x = heap[--sz];
22         int i = 0;
23         while ((i << 1) + 1 < sz){
24             int a = (i << 1) + 1, b = (i << 1) + 2;
25             if (b < sz && heap[a] <= heap[b]) a = b;
26             if (heap[a] <= x) break;
27             heap[i] = heap[a];
28             i = a;
29         }
30         heap[i] = x;
31         return ret;
32     }
33 }ans;
34 int main(){
35 #ifdef LOCAL
36     freopen("in.txt", "r", stdin);
37     freopen("out.txt", "w+", stdout);
38 #endif
39     int n;
40     double a, b;
41     scanf("%d", &n);
42     while (n--){
43         scanf("%lf", &a);
44         ans.push(a);
45     }
46     while (ans.sz > 1){
47         a = ans.pop(), b = ans.pop();
48         ans.push(2 * sqrt(a * b));
49     }
50     printf("%.3lf", ans.pop());
51     return 0;
52 }
View Code

3:

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cmath>
 4 #include<iostream>
 5 const int Max_N = 110;
 6 double heap[Max_N];
 7 int sz = 0;
 8 void push(double x){
 9     int i = sz++;
10     while (i > 0){
11         int p = (i - 1) >> 1;
12         if (heap[p] >= x) break;
13         heap[i] = heap[p];
14         i = p;
15     }
16     heap[i] = x;
17 }
18 double pop(){
19     double ret = heap[0], x = heap[--sz];
20     int i = 0;
21     while ((i << 1) + 1 < sz){
22         int a = (i << 1) + 1, b = (i << 1) + 2;
23         if (b < sz && heap[a] <= heap[b]) a = b;
24         if (heap[a] <= x) break;
25         heap[i] = heap[a];
26         i = a;
27     }
28     heap[i] = x;
29     return ret;
30 }
31 int main(){
32 #ifdef LOCAL
33     freopen("in.txt", "r", stdin);
34     freopen("out.txt", "w+", stdout);
35 #endif
36     int n;
37     double a, b;
38 
39     scanf("%d", &n);
40     while (n--){
41         scanf("%lf", &a);
42         push(a);
43     }
44     while (sz > 1){
45         a = pop(), b = pop();
46         push(2 * sqrt(a * b));
47     }
48     printf("%.3lf", pop());
49     return 0;
50 }
View Code

4:

std::priority_queue<double> ans
 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cmath>
 4 #include<queue>
 5 #include<iostream>
 6 int main(){
 7 #ifdef LOCAL
 8     freopen("in.txt", "r", stdin);
 9     freopen("out.txt", "w+", stdout);
10 #endif
11     int n;
12     double a, b;
13     scanf("%d", &n);
14     std::priority_queue<double> ans;
15     while (n--){
16         scanf("%lf", &a);
17         ans.push(a);
18     }
19     while (ans.size() > 1){
20         a = ans.top(), ans.pop();
21         b = ans.top(), ans.pop();
22         ans.push(2 * sqrt(a * b));
23     }
24     printf("%.3lf", ans.top());
25     return 0;
26 }
View Code
By: GadyPu 博客地址:http://www.cnblogs.com/GadyPu/ 转载请说明
原文地址:https://www.cnblogs.com/GadyPu/p/4456873.html