CodeForces140C (堆雪人)

就是三个不同的雪球可以堆一个雪人。

问,最多可以堆几个雪人。

贪心,最多的三个开始贪心,这样一定最优。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <queue>
 6 #include <map>
 7 using namespace std;
 8 const int maxn = 1e5;
 9 int a1[maxn], b1[maxn], c1[maxn];
10 struct node
11 {
12     int num, r;
13     node(){}
14     node(int nn, int rr) :num(nn), r(rr){}
15     bool operator < (const node &a) const
16     {
17         if(num != a.num)  //按照数量排序
18             return num < a.num;
19         else
20             return r < a.r;  //数量一样最大的在前面
21     }
22 };
23 int main()
24 {
25 
26     int n;
27     while(~scanf("%d", &n))
28     {
29         map<int, int> m;
30         int a;
31         for(int i = 1; i <= n; i++)
32         {
33             scanf("%d", &a);
34             m[a]++;  //这里一开始想用book,发现半径1e9,会爆数组 就用map了
35         }
36         priority_queue<node> q;
37         for(map<int, int>::iterator it = m.begin(); it != m.end(); it++)  //迭代器,把下表跟值都压进去
38         {
39             q.push(node(it->second, it->first));
40         }
41         if(q.size() < 3) //一开始小于3肯定不行
42         {
43             printf("0\n");
44             continue;
45         }
46         int sum = 0, index = 0;
47         while(q.size() >= 3)
48         {
49             node a = q.top();  //取前三个
50             q.pop();
51             node b = q.top();
52             q.pop();
53             node c = q.top();
54             q.pop();
55             sum++;
56             a1[index] = a.r;
57             b1[index] = b.r;
58             c1[index++] = c.r;
59             if(a.num-1 != 0) q.push(node(a.num-1, a.r));  //如果前三个-1之后不为0就继续压进队列
60             if(b.num-1 != 0) q.push(node(b.num-1, b.r));
61             if(c.num-1 != 0) q.push(node(c.num-1, c.r));
62         }
63         printf("%d\n", sum);
64         for(int i = 0; i < index; i++)
65         {
66             if(a1[i] < b1[i]) swap(a1[i], b1[i]);  //别忘记这一步。。。
67             if(a1[i] < c1[i]) swap(a1[i], c1[i]);
68             if(b1[i] < c1[i]) swap(b1[i], c1[i]);
69         }
70         for(int i = 0; i < index; i++)
71         {
72             printf("%d %d %d\n", a1[i], b1[i], c1[i]);
73         }
74     }
75     return 0;
76 }

 

posted @ 2017-11-01 15:26  Kaiser-  阅读(213)  评论(0编辑  收藏  举报