codeforce 140C

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


#include

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include


#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;




mapa;
typedef pair p;//使用typedef为现有类型创建同义字,定义易于记忆的类型名
priority_queue

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     {
        scanf("%d",&x);
        a[x]++;
    }
    for(map::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     {
        sort(ans[i],ans[i]+3);
        printf("%d %d %d\n",ans[i][2],ans[i][1],ans[i][0]);
    }
    return 0;
}


你可能感兴趣的:(ACM-ICPC)