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 }