L2-007 家庭房产

cpp 复制代码
#include<bits/stdc++.h> 
using namespace std; 
const int N=9999; 
int S[N]; // S[i]=1,编号为i的人是否存在 
int s[N+10]; //并查集,查询编号为i的人家族中,编号最小的人的编号 
using family = array<int, 4>; //编号、人数、总房产套数、总房产面积 
using people = array<int, 3>; //编号、房产套数、房产面积 
family f[N+10]; 
people p[N+10]; 

int find(int x){// 查
	return s[x]==x?x:s[x]=find(s[x]); 
}

void merge(int i, int j){// 并 
	i=find(i), j=find(j); 
	if(i<j) swap(i, j);
	s[i]=j; 
}

signed main(){
	
	//初始化
	for(int i=0;i<=N;i++)  
	s[i]=i, f[i][0]=i; 
	
	int n; cin>>n;
	for(int i=1;i<=n;i++) {
		int id,father,mother,k;  
		cin>>id>>father>>mother>>k; 
		if(father!=-1) merge(id, father); 
		if(mother!=-1) merge(id, mother); 
		S[id]=S[father]=S[mother]=1; 
		for(int j=1;j<=k;j++){
			int x; cin>>x;  S[x]=1; 
			merge(x, id); 
		}
		int cnt, area; cin>>cnt>>area; 
		p[i]={id, cnt, area}; 
	}
	
	vector<int>indx; //所有家庭中成员(最小)编号索引 
	// 统计人数
	for(int i=0;i<=N;i++) {
		if(!S[i]) continue; 
		int target = find(i); 
		f[target][1]++; 
		if(i==target) indx.push_back(i); 
	}
	
	// 统计房产
	for(int i=1;i<=n;i++) {
		auto [id, cnt, area] = p[i]; 
		int target = find(id); 
		f[target][2]+=cnt; 
		f[target][3]+=area; 
	}
	
	vector<family>ans; 
	for(auto it : indx)
	ans.push_back(f[it]); 
	
	// 排序
	sort(ans.begin(), ans.end(), [](family x, family y){
		double avgx = (double)x[3]/x[1], avgy = (double)y[3]/y[1]; 
		if(avgx!=avgy) return avgx>avgy; // 先按人均面积降序
		return x[0]<y[0]; // 再按成员编号的升序
	}); 
	
	cout<<ans.size(); 
	for(auto [id, nums, cnt, area]:ans){
		cout<<endl; 
		cout<<setfill('0')<<setw(4)<<id<<' '<<nums<<' '; 
		cout<<fixed<<setprecision(3)<<(double)cnt/nums<<' '; 
		cout<<fixed<<setprecision(3)<<(double)area/nums; 
	}
} 

考点:

并查集、模拟、排序

注意:

1."编号是每个人独有的一个4位数的编号",需要注意家庭成员的输出格式

cpp 复制代码
cout<<setfill('0')<<setw(4)<<id<<' '<<nums<<' '; 

2."人均值要求保留小数点后3位"

cpp 复制代码
cout<<fixed<<setprecision(3)<<(double)cnt/nums<<' ';
cout<<fixed<<setprecision(3)<<(double)area/nums;  

3.父母编号可能为-1,记得处理

4.并查集数组别忘了初始化

26/4/4

相关推荐
JieE2121 天前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
JieE2122 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack203 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树3 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE2123 天前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE2123 天前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术4 天前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦4 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
clint4564 天前
C++进阶(1)——前景提要
c++