C++ 代码:统计家庭人口、人均房产面积和房产套数
根据题目要求,我们可以使用结构体来表示每个人的信息,然后使用递归的方式构建家庭树,并计算每个家庭的人口数、人均房产面积及房产套数。
以下是完整的 C++ 代码实现:
#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>
using namespace std;
struct Person {
int id; // 编号
int father; // 父亲编号
int mother; // 母亲编号
int numChildren; // 孩子数量
vector<int> children; // 孩子编号
int numHouses; // 房产套数
int totalArea; // 总面积
};
vector<Person> people;
vector<int> family; // 记录每个人所属的家庭编号
vector<int> familyMembers; // 记录每个家庭的人口数
vector<double> familyAvgHouses; // 记录每个家庭的人均房产套数
vector<double> familyAvgArea; // 记录每个家庭的人均房产面积
// 递归计算每个家庭的信息
void calculateFamilyInfo(int root, int familyId) {
family[people[root].id] = familyId;
familyMembers[familyId]++;
familyAvgHouses[familyId] += people[root].numHouses;
familyAvgArea[familyId] += people[root].totalArea;
for (int child : people[root].children) {
calculateFamilyInfo(child, familyId);
}
}
int main() {
int N;
cin >> N;
people.resize(N);
family.resize(10000, -1);
familyMembers.resize(10000, 0);
familyAvgHouses.resize(10000, 0);
familyAvgArea.resize(10000, 0);
for (int i = 0; i < N; i++) {
cin >> people[i].id >> people[i].father >> people[i].mother;
cin >> people[i].numChildren;
for (int j = 0; j < people[i].numChildren; j++) {
int child;
cin >> child;
people[i].children.push_back(child);
}
cin >> people[i].numHouses >> people[i].totalArea;
}
int familyCount = 0;
for (int i = 0; i < N; i++) {
if (family[people[i].id] == -1) {
calculateFamilyInfo(i, familyCount);
familyCount++;
}
}
cout << familyCount << endl;
vector<pair<int, int>> sortedFamily;
for (int i = 0; i < familyCount; i++) {
sortedFamily.push_back(make_pair(i, familyAvgArea[i] / familyMembers[i]));
}
sort(sortedFamily.begin(), sortedFamily.end(), [](const pair<int, int>& a, const pair<int, int>& b) {
if (a.second == b.second) {
return a.first < b.first;
}
return a.second > b.second;
});
for (const auto& f : sortedFamily) {
int familyId = f.first;
cout << setw(4) << setfill('0') << people[familyId].id << ' ';
cout << familyMembers[familyId] << ' ';
cout << fixed << setprecision(3) << familyAvgHouses[familyId] / familyMembers[familyId] << ' ';
cout << fixed << setprecision(3) << familyAvgArea[familyId] / familyMembers[familyId] << endl;
}
return 0;
}
在上面的代码中,我们使用了vector来保存每个人的信息,family数组来记录每个人所属的家庭编号,familyMembers数组来记录每个家庭的人口数,familyAvgHouses数组来记录每个家庭的人均房产套数,familyAvgArea数组来记录每个家庭的人均房产面积。
首先,我们读取输入数据,构建每个人的结构体,并将其存储在people数组中。然后,我们使用递归的方式计算每个家庭的信息。具体地,我们从根节点开始,对每个人的子女节点递归调用calculateFamilyInfo函数,传入子女节点的编号和当前家庭编号。在递归过程中,我们更新family、familyMembers、familyAvgHouses和familyAvgArea数组。
接下来,我们统计家庭个数,并将每个家庭的信息存储在sortedFamily数组中。然后,我们根据人均面积降序排序sortedFamily数组,并按照要求输出每个家庭的信息。
最后,我们输出家庭个数,并按照题目要求格式输出每个家庭的信息。
以上代码可以通过牛客网在线编程平台进行测试,链接如下:https://www.nowcoder.com/questionTerminal/fe306c9761a149ebbe6bc9a3cafb4f99
原文地址: https://www.cveoy.top/t/topic/o1Cs 著作权归作者所有。请勿转载和采集!