codeforce 140C

来源:互联网 发布:linux vsftpd 怎么使用 编辑:程序博客网 时间:2024/06/06 15:51

让你找出三个不同的数字来,注意从大到小排序,最开始我的想法是二分查找做标记,但是我发现这样是错的,看了题解之后发现,我们可以每个数字的个数的多少作为优先级,插入优先级队列中,然后进行查找。


#include<iostream>

#include<cstdio>
#include<string.h>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<sstream>
#include<queue>


#define ll __int64
#define lll unsigned long long
#define MAX 100009
#define MAXN 2009
#define eps 1e-8
#define INF 0x7fffffff
#define mod 1000000007
#define clr(a) memset(a,0,sizeof(a))
#define clr1(a) memset(a,-1,sizeof(a))
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1


using namespace std;




map<int,int>a;
typedef pair<int,int> p;//使用typedef为现有类型创建同义字,定义易于记忆的类型名
priority_queue<p>Q;
int ans[MAX][3];


int main()
{
#ifdef ONLINE_JUDGE
#else
    freopen("an.txt","r", stdin);
#endif
    int n,x;
    scanf("%d",&n);
    for(int i = 0;i<n;i++)
    {
        scanf("%d",&x);
        a[x]++;
    }
    for(map<int,int>::iterator it = a.begin();it!=a.end();it++)
    {
        Q.push(make_pair(it->second,it->first));
    }
    int kk = 0;
    while(Q.size()>=3)
    {
        p A = Q.top();Q.pop();
        p B = Q.top();Q.pop();
        p C = Q.top();Q.pop();
        ans[kk][2] = A.second;
        ans[kk][1] = B.second;
        ans[kk][0] = C.second;
        kk++;
        if(--A.first>0)Q.push(A);
        if(--B.first>0)Q.push(B);
        if(--C.first>0)Q.push(C);
    }
    printf("%d\n",kk);
    for(int i = 0;i<kk;i++)
    {
        sort(ans[i],ans[i]+3);
        printf("%d %d %d\n",ans[i][2],ans[i][1],ans[i][0]);
    }
    return 0;
}


0 0
原创粉丝点击