HLG 1176 小陈老师、雪人【优先队列+map】

Description
东北的冬季,尤其是过年的时候,小陈老师喜欢去堆雪人。
每个雪人主要由三个雪球构成:大雪球、中雪球、小雪球。
他已经准备好了N个雪球,半径分别等于r1, r2, ..., rn。如果要堆一个雪人,就需要三个半径互不相等的雪球。
例如:
三个雪球的半径为1、2、3,能够用来堆一个雪人。但是半径为2、2、3或者2、2、2的三个雪球就不可以。
快帮帮小陈老师,算算他最多能用这些雪球堆多少个雪人。
Input
对于每组测试数据:
第1行,包含一个整数n(1≤n≤100000) — 雪球的数量。
第2行,包含n个整数 — 雪球的半径r1, r2, ..., rn (1≤ri≤1000000000)。
处理到文件结束
Output
对于每组测试数据:
第1行,输出最多能堆多少雪人 - k。
接下来k行,每行描述一个雪人,每行用空格分割三个数字分别表示大雪球、中雪球、小雪球的半径。
可以用任何顺序输出每个雪人。如果有多种可行解,输出任意一个即可。
Sample Input
7
1 2 3 4 5 6 7
3
2 2 3
Sample Output
2
3 2 1
6 5 4
0

分析:每次输出最多的三个雪球。

code:

View Code
#include<stdio.h>
#include<string.h>
#include<map>
#include<queue>
#include<stdlib.h>
using namespace std;
int cmp(const void*p1,const void*p2)
{
return *(int*)p1-*(int*)p2;
}
struct node
{
long long r;
long long tot;
const bool operator < (const struct node&a)const
{
return tot<a.tot;
}
}tmp,tmp1,tmp2,tmp3;
map<long long,long long> v;
long long a[100005];
long long res[40000][3];
int main()
{
int t,i,n,top;
while(scanf("%d",&n)!=EOF)
{
priority_queue<node>que;
v.clear();
for(i=0;i<n;i++)
{
scanf("%lld",&a[i]);
v[a[i]]++;
}
for(i=0;i<n;i++)
{
if(v[a[i]])
{
tmp.r=a[i];
tmp.tot=v[a[i]];
v[a[i]]=0;
que.push(tmp);
}
}
top=0;
while(que.size()>2)
{
tmp1=que.top();
que.pop();
tmp2=que.top();
que.pop();
tmp3=que.top();
que.pop();
res[top][0]=tmp1.r;
res[top][1]=tmp2.r;
res[top][2]=tmp3.r;
qsort(res[top],3,sizeof(long long),cmp);
top++;
tmp1.tot--; if(tmp1.tot) que.push(tmp1);
tmp2.tot--; if(tmp2.tot) que.push(tmp2);
tmp3.tot--; if(tmp3.tot) que.push(tmp3);
}
printf("%d\n",top);
for(i=0;i<top;i++)
printf("%lld %lld %lld\n",res[i][2],res[i][1],res[i][0]);
}
return 0;
}

 

posted @ 2012-03-16 00:29  'wind  阅读(268)  评论(0编辑  收藏  举报