「CF 140C」 New Year Snowmen

题目链接

戳这

贪心+优先队列,只要每次将数量前三大的半径拿出来就好了,用优先队列维护一下

#include<bits/stdc++.h>
#define rg register
#define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
int read(){
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();
    while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();
    return f*x;
}
struct hh{
    int v,id;
    bool operator < (hh a) const {
        return v<a.v;
    }
}a[100001];
struct node {
    int x,y,z;
}c[100001];
int b[100001],d[100001];
priority_queue<hh> q;
int main(){
    int n=read(),tot=1,cnt=0;
    for(int i=1;i<=n;i++)
        a[i].v=read(),a[i].id=i;
    sort(a+1,a+1+n);
    a[0].v=-2147483647;
    for(int i=2;i<=n+1;i++){
        if(a[i].v!=a[i-1].v){
            hh now;
            now.id=a[i-1].v,now.v=tot;
            q.push(now),tot=1;
        }
        else
            tot++;
    }
    hh now;
    now=q.top();
    int cc=0;
    while(q.size()>=3){
        hh now1,now2,now3;
        now1=q.top(),q.pop();
        now2=q.top(),q.pop();
        now3=q.top(),q.pop();
        now1.v--,now2.v--,now3.v--;
        if(now1.v) q.push(now1),cc++;
        if(now2.v) q.push(now2),cc++;
        if(now3.v) q.push(now3),cc++;
        c[++cnt].x=now1.id,c[cnt].y=now2.id,c[cnt].z=now3.id;
    }
    printf("%d
",cnt);
    for(int i=1;i<=cnt;i++){
        int l=min(c[i].x,min(c[i].y,c[i].z)),r=max(c[i].x,max(c[i].y,c[i].z));
        
        printf("%d ",r);
        if(c[i].x<r&&c[i].x>l)
            printf("%d ",c[i].x);
        if(c[i].y<r&&c[i].y>l)
            printf("%d ",c[i].y);
        if(c[i].z<r&&c[i].z>l)
            printf("%d ",c[i].z);
        printf("%d
",l);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/hbxblog/p/10150701.html