根据题目要求,我们可以使用结构体来表示每个人的信息,然后使用递归的方式构建家庭树,并计算每个家庭的人口数、人均房产面积及房产套数。

以下是完整的 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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录