zoukankan      html  css  js  c++  java
  • L2-007 家庭房产 (25 分) (并查集)

    给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数、人均房产面积及房产套数。

    输入格式:

    输入第一行给出一个正整数N(≤1000),随后N行,每行按下列格式给出一个人的房产:

    编号 父 母 k 孩子1 ... 孩子k 房产套数 总面积
    

    其中编号是每个人独有的一个4位数的编号;分别是该编号对应的这个人的父母的编号(如果已经过世,则显示-1);k(0≤k≤5)是该人的子女的个数;孩子i是其子女的编号。

    输出格式:

    首先在第一行输出家庭个数(所有有亲属关系的人都属于同一个家庭)。随后按下列格式输出每个家庭的信息:

    家庭成员的最小编号 家庭人口数 人均房产套数 人均房产面积
    

    其中人均值要求保留小数点后3位。家庭信息首先按人均面积降序输出,若有并列,则按成员编号的升序输出。

    输入样例:

    10
    6666 5551 5552 1 7777 1 100
    1234 5678 9012 1 0002 2 300
    8888 -1 -1 0 1 1000
    2468 0001 0004 1 2222 1 500
    7777 6666 -1 0 2 300
    3721 -1 -1 1 2333 2 150
    9012 -1 -1 3 1236 1235 1234 1 100
    1235 5678 9012 0 1 50
    2222 1236 2468 2 6661 6662 1 300
    2333 -1 3721 3 6661 6662 6663 1 100
    

    输出样例:

    3
    8888 1 1.000 1000.000
    0001 15 0.600 100.000
    5551 4 0.750 100.000
    

    Solution

    用并查集维护集合关系,由于要输出最小编号,合并时将较大的合并给较小的点,由于编号一共最多到9999,记录每个编号是否出现过,然后遍历一遍,将每个编号所拥有的房产等信息贡献给父节点。之后按照题目要求排序输出即可。

    需要注釋掉 ios_base::sync_with_stdio(false), cin.tie(0);

    // Murabito-B 21/04/22
    #include <bits/stdc++.h>
    using namespace std;
    using ll    = long long;
    const int N = 1e4 + 10;
    struct node {
        int id, kou, fang, mian;
        double x1, x2;
        const bool operator<(const node &b) const {
            if (b.x2 == x2) return id < b.id;
            return x2 > b.x2;
        }
    } p[N];
    int tao[N], ji[N], fa[N], vis[N];
    int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
    void merge(int x, int y) {
        x = find(x), y = find(y);
        if (x > y) fa[x] = y;
        else
            fa[y] = x;
    }
    void solve() {
        int n;
        cin >> n;
        for (int i = 0; i < N; ++i) fa[i] = i;
        while (n--) {
            int id, mu, fu, k;
            cin >> id >> mu >> fu >> k;
            vis[id] = 1;
            if (mu != -1) merge(id, mu), vis[mu] = 1;
            if (fu != -1) merge(id, fu), vis[fu] = 1;
            while (k--) {
                int x;
                cin >> x, vis[x] = 1;
                merge(id, x);
            }
            cin >> tao[id] >> ji[id];
        }
        for (int i = 0; i < N; ++i) {
            if (vis[i]) {
                int x = find(i);
                p[x].kou++;
                p[x].fang += tao[i];
                p[x].mian += ji[i];
            }
        }
        vector<node> ans;
        for (int i = 0; i < N; i++) {
            if (vis[i] && find(i) == i) {
                p[i].id = i;
                p[i].x1 = p[i].fang * 1.0 / p[i].kou;
                p[i].x2 = p[i].mian * 1.0 / p[i].kou;
                ans.push_back(p[i]);
            }
        }
        sort(ans.begin(), ans.end());
        cout << ans.size() << endl;
        for (int i = 0; i < ans.size(); i++) {
            printf("%04d %d %.3lf %.3lf
    ", ans[i].id, ans[i].kou, ans[i].x1, ans[i].x2);
        }
    }
    int main() {
        // ios_base::sync_with_stdio(false), cin.tie(0);
        solve();
        return 0;
    }
    

    The desire of his soul is the prophecy of his fate
    你灵魂的欲望,是你命运的先知。

  • 相关阅读:
    Maven 集成Tomcat插件
    dubbo 序列化 问题 属性值 丢失 ArrayList 解决
    docker 中安装 FastDFS 总结
    docker 从容器中拷文件到宿主机器中
    db2 相关命令
    Webphere WAS 启动
    CKEDITOR 4.6.X 版本 插件 弹出对话框 Dialog中 表格 Table 自定义样式Style 问题
    SpringMVC JSONP JSON支持
    CKEDITOR 3.4.2中 按钮事件中 动态改变图标和title 获取按钮
    git回退到远程某个版本
  • 原文地址:https://www.cnblogs.com/RioTian/p/14691569.html
Copyright © 2011-2022 走看看