CF140C New Year Snowmen
阿新 • • 發佈:2018-12-20
題目連結
貪心+優先佇列,只要每次講數量前三大的半徑拿出來就好了,用優先佇列維護一下
#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(){ // file(""); 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(); // printf("%d",now.v); 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\n",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\n",l); } return 0; }