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

相关推荐
叠层归一研究院1 小时前
基于极限自指的叠层归一宇宙结构理论——无元外部封闭系统的内生区分模型
人工智能·经验分享·算法·agi
Selvaggia2 小时前
Diffusion Model 的基本原理与模型架构
算法
汉克老师3 小时前
CSP-J 2026 初赛试题解析(第一部分:选择题(8-15))精讲
c++·csp-j·小学生·学c++编程
wabs6663 小时前
关于二叉树【力扣572.另一棵树的子树的思考】
数据结构·c++·算法·leetcode·二叉树
hanlin033 小时前
刷题笔记:力扣第41题-缺失的第一个正数
笔记·算法·leetcode
shehuiyuelaiyuehao4 小时前
算法50,分治归并,数组中的逆序对
java·算法
风合星语4 小时前
2026 ROS 2 Lyrical C++ 入门(五):Action 实战——任务反馈、取消与超时处理
c++·机器人·ros2·异步编程·lyrical
阳明山水4 小时前
校准分位数驱动智能库存决策
人工智能·深度学习·算法·机器学习·架构
91刘仁德5 小时前
C++ 继承和多态 设计模式
c语言·c++·笔记
雨落在了我的手上5 小时前
Java数据结构(十四):Map和Set
数据结构