91pts求助(悬2关)
查看原帖
91pts求助(悬2关)
1287433
__ycy1124__楼主2024/7/11 12:46
#include<bits/stdc++.h>
using namespace std;
int a[100001];
struct Node{
	int js,w;
}b[100001];
int ans[100001][3];
bool cmp(Node x1,Node x2){
	return x1.w>x2.w;
}
int tot=0;
Node q[100001];
void work(int x){
	if(x/2>=1&&q[x].js<q[x/2].js){
		swap(q[x],q[x/2]);
		work(x/2);
	}
}
void work1(int x){
	if(q[x*2].js<q[x*2+1].js&&x*2+1<=tot&&q[x*2].js<q[x].js){
		swap(q[x*2],q[x]);
		work1(x*2);
	}
	else if(x*2+1<=tot&&q[x*2+1].js<q[x].js){
		swap(q[x*2+1],q[x]);
		work1(x*2+1);
	}
	else if(x*2==tot&&q[x*2].js>q[x].js){
		swap(q[x],q[2*x]);
		work1(2*x);
	}
	else{
		return;
	}
}
int main(){
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	sort(a+1,a+n+1);
	int tot=0;
	for(int i=1;i<=n;i++){
		if(a[i]!=a[i-1]){
			tot++;
			b[tot].w=a[i];
		}
		b[tot].js++;
	}
	for(int i=1;i<=tot;i++){
		q[i]=b[i];
		work(i);
	}
	int js=0;
	while(tot>=3){
		Node x[3];
		for(int i=0;i<=2;i++){
			x[i]=q[1];
			swap(q[1],q[tot]);
			tot--;
			work1(1);
			x[i].js--;
		}
		sort(x,x+3,cmp);
		js++;
		for(int i=0;i<=2;i++){
			ans[js][i]=x[i].w;
			if(x[i].js>=1){
				q[++tot]=x[i];
				work(tot);
			}
		}
	}
	printf("%d\n",js);
	for(int i=1;i<=js;i++){
		for(int j=0;j<=2;j++){
			printf("%d ",ans[i][j]);
		}
		printf("\n");
	}
	return 0;
}
2024/7/11 12:46
加载中...