60pts 求调
查看原帖
60pts 求调
1079531
lcycl楼主2025/7/27 11:52
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int T;
int n;
int a[N];
struct tttt{
	int id,num;
};
tttt ans[N];
tttt dd[N][N];
int c[N][N];
int cnt[N];
//vector<int> ans[N];
bool cmp(tttt x,tttt y){
	return x.num<y.num;
}
int main(){
	cin>>T;
	while(T--){
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>a[i];
		}
		if(n%2==1){
			cout<<"-1\n";
			continue;
		}
		a[n+1]=0;
		sort(a+1,a+n+1);
		int tot=1,tt=0,maxx=0,sum=0;
		for(int i=1;i<=n;i++){
			if(a[i]!=a[i+1]){
				maxx=max(tot,maxx);
				ans[++tt].id=a[i];
				ans[tt].num=tot;
				tot=1;
				sum+=ans[tt].num;
			}
			else{
				++tot;
			}
		}
		if(maxx*2>sum){
			cout<<"-1\n";
			for(int i=1;i<=tt;i++){
				ans[i].num=ans[i].id=0;
			}
			continue;
		}
		int back=1;
		int di=0;
		bool f=0;
		int ttt=0;
		int disum=0;
		while(1){
			sort(ans+back,ans+tt+1,cmp);
			while(back<=tt&&!ans[back].num)++back;
			if(back==tt+1){
				f=1;
				break;
			}
			if(back==tt){
				cout<<"-1\n";
				break;
			}
			di++;
			for(int i=tt;i>=back;i--){
				if(i==back&&(tt-i+1)%2){
					if(ans[i].num>maxx){
						maxx=ans[i].num;
					}
					break;
				}
				else{
					if(ans[i].num==maxx){
						if((sum-1)<(maxx-1)*2){
							break;
						}
						else{
							maxx--;
						}
					}
					else{
						if(sum-1<maxx*2){
							break;
						}
					}
					c[di][++c[di][0]]=ans[i].id;
					ans[i].num--;
					sum--;
				}
			}
//			int to=1;
//			for(int i=1;i<=c[di][0];i++){
//				if(c[di][i]!=c[di][i+1]){
//					dd[di][++ttt].id=c[di][i];
//					dd[di][ttt].num=to;
//					to=1;
//				}
//				else{
//					++to;
//				}
//			}
		}
		if(f==1){
			if(c[1][0]*2==n&&di!=2){
				int len=c[1][0];
				//while(len){
					//int kk=len;
					for(int i=2;i<=di;i++){
						for(int k=1;k<=c[1][0];k++){
							int vis=0;
							for(int j=1;j<=c[i][0];j++){
								if(c[i][j]!=c[1][k]&&c[1][k]!=0){
									vis++;
								}
							}
							if(vis==c[i][0]&&cnt[i]<2){
								//dd[i][++c[i][0]].num++;
								//dd[i][c[i][0]].id=c[1][k];
								c[i][++c[i][0]]=c[1][k];
								c[1][k]=0;
								cnt[i]++;
							}
						}
					} 
				//}
				cout<<di-1<<"\n";
				for(int i=2;i<=di;i++){
					for(int j=0;j<=c[i][0];j++){
						cout<<c[i][j]<<" ";
					}
					cout<<"\n";
				}
			}
			else{
				cout<<di<<"\n";
				for(int i=1;i<=di;i++){
					for(int j=0;j<=c[i][0];j++){
						cout<<c[i][j]<<" ";
					}
					cout<<"\n";
				}
			}
			
		}
		for(int i=1;i<=di;i++){
			c[i][0]=0;
		}
		for(int i=1;i<=tt;i++){
			ans[i].num=ans[i].id=0;
		}
//		for(int i=1;i<=tt;i++){
//			cout<<ans[i].id<<"->"<<ans[i].num<<"\n";
//		}
//		for(int i=1;i<=tt;i++){
//			for(int j=0;j<ans[i].size();j++){
//				cout<<ans[i][j]<<" ";
//			}
//			cout<<"\n";
//		}
	}
	return 0;
}
2025/7/27 11:52
加载中...