1114 Family Property

本文介绍了一个用于统计家庭成员间财产平均值的C++程序。该程序通过并查集算法确定家庭成员之间的关系,并计算每个家庭的成员数、平均财产值及平均面积值。最后按家庭平均面积降序输出家庭信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
#define MAXN 10000
struct people{
	int id;
	int fa,ma;
	int child[5];
	double estate;
	double area;
};
struct family{
	int idd;
	double num;
	double avgsets;
	double avgarea;
	family(){
		num=0;
		avgsets=0;
		avgarea=0;
	}
};
bool cmp(family a,family b){
	if(a.avgarea!=b.avgarea) return a.avgarea>b.avgarea;
	else if(a.idd!=b.idd) return a.idd<b.idd;
}
int fa[MAXN];
void init(){
	for(int i=0;i<MAXN;i++){
		fa[i]=i;
	}
}
int getfather(int x){
	int a=x;
	while(x!=fa[x]){
		x=fa[x];
	}
	while(a!=fa[a]){
		int z=a;
		a=fa[a];
		fa[z]=x;
	}
	return x;
}
void _union(int a,int b){
	int aa=getfather(a);
	int bb=getfather(b);
	if(aa>bb) fa[aa]=bb;
	else if(aa<bb) fa[bb]=aa;
}
int main(){
	#ifndef ONLINE_JUDGE
	freopen("in.txt","r",stdin);
	#endif
	int n;
	cin>>n;
	vector<people> _all;
	int sign[MAXN]={};
	init(); 
	for(int i=0;i<n;i++){
		people temp;
		int k;
		cin>>temp.id>>temp.fa>>temp.ma>>k;
		sign[temp.id]=1;
		if(temp.fa!=-1){
			_union(temp.fa,temp.id);
			sign[temp.fa]=1;
		}
		if(temp.ma!=-1){
			_union(temp.ma,temp.id);
			sign[temp.ma]=1;	
		} 
		for(int j=0;j<k;j++){
			cin>>temp.child[j];
			sign[temp.child[j]]=1;
			_union(temp.child[j],temp.id);
		}
		cin>>temp.estate>>temp.area;
		_all.push_back(temp);
	}
	int familycnt=0;
	int flag[MAXN]={};
	vector<family> _trival(MAXN);
	for(int i=0;i<n;i++){
		_trival[getfather(_all[i].id)].idd=getfather(_all[i].id);
		flag[getfather(_all[i].id)]=1;
		_trival[getfather(_all[i].id)].avgsets+=_all[i].estate;
		_trival[getfather(_all[i].id)].avgarea+=_all[i].area;
	}
	for(int i=0;i<10000;i++){
		if(flag[i]==1) familycnt++;
		if(sign[i]==1) ++_trival[getfather(i)].num;
	}
	for(int i=0;i<MAXN;i++){
		if(flag[i]==1){
			_trival[i].avgsets/=_trival[i].num;
			_trival[i].avgarea/=_trival[i].num;
		}
		
	}
	cout<<familycnt<<endl;
	vector<family> _ttrival;
	for(int i=0;i<_trival.size();i++){
		if(flag[i]==1){
			_ttrival.push_back(_trival[i]);
		}
	}
	sort(_ttrival.begin(),_ttrival.end(),cmp);
	for(int i=0;i<_ttrival.size();i++){
		printf("%04d %.lf %.3lf %.3lf\n",_ttrival[i].idd,_ttrival[i].num,_ttrival[i].avgsets,_ttrival[i].avgarea);
	}
	return 0;
}

傻逼题目毁我青春

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值