L2-007 家庭房產

YuKiCheng發表於2024-04-20

好累。

#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
#define ll long long
int parent[10010],exist[10010];
struct node{
	int rs;//人數
	double mj,ts;//面積,套數 
}s[10000];
bool cmp(int x,int y){
	if(s[x].mj!=s[y].mj) return s[x].mj>s[y].mj;
	return x < y;
}
int getf(int x){
	int y=x;
	while(parent[y]!=-1){
		y=parent[y];
	}
	return y;
}
void merge(int x,int y){
	int p1=getf(x);
	int p2=getf(y);
	if(p1==p2) return;
	//比較小的
	if(p1<p2) parent[p2]=p1;
	else parent[p1]=p2; 
}
int main(){
	memset(parent,-1,sizeof(parent));
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		int sno,p1,p2,count,ch,ts,mj;
		cin>>sno>>p1>>p2>>count;
		exist[sno]=1;
		if(p1!=-1) {
			merge(sno,p1);
			exist[p1]=1;
		}
		if(p2!=-1) {
			merge(sno,p2);
			exist[p2]=1;
		}
		for(int j=0;j<count;j++){
			cin>>ch;
			merge(sno,ch);
			exist[ch]=1;
		}
		cin>>s[sno].ts>>s[sno].mj;
	}
	//彙總家庭人數 套數和麵積
	vector<int> vec;
	for(int i=0;i<10000;i++){
		if(exist[i]){
			int parent=getf(i);
			if(parent!=i){
				s[parent].ts += s[i].ts;
				s[parent].mj += s[i].mj;
			}else{
				vec.push_back(parent);
			}
			s[parent].rs+=1;
		}
	} 
	for(int i=0;i<vec.size();i++){
		int parent = vec[i];
		s[parent].mj/=s[parent].rs;
		s[parent].ts/=s[parent].rs;
	}
	sort(vec.begin(),vec.end(),cmp);
	cout<<vec.size()<<'\n';
	for(int i=0;i<vec.size();i++){
		printf("%04d %d %.3lf %.3lf\n",vec[i],s[vec[i]].rs,s[vec[i]].ts,s[vec[i]].mj);
	}
	return 0;
}

相關文章