CodeForces 140C New Year Snowmen
二分,贪心。
二分答案,然后贪心验证即可。
#include<bits/stdc++.h> using namespace std; int n,a[100010]; int p[100010][3]; int sz[100010]; bool check(int x) { if(x==0) return 1; memset(sz,0,sizeof sz); for(int i=1;i<=x;i++) { p[i][0]=a[i]; sz[i]=1; } int now=1; for(int i=x+1;i<=n;i++) { if(p[now][sz[now]-1]==a[i]) continue; if(sz[now]==3) break; p[now][sz[now]]=a[i]; sz[now]++; now++; if(now==x+1) now=1; } for(int i=1;i<=x;i++) { if(sz[i]<3) return 0; } return 1; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+1+n); int L=0,R=n/3,ans; while(L<=R) { int mid=(L+R)/2; if(check(mid)) L=mid+1,ans=mid; else R=mid-1; } check(ans); printf("%d\n",ans); for(int i=1;i<=ans;i++) { printf("%d %d %d\n",p[i][2],p[i][1],p[i][0]); } return 0; }