zoukankan      html  css  js  c++  java
  • PAT L2-007 家庭房产

    https://pintia.cn/problem-sets/994805046380707840/problems/994805068539215872

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

    输入格式:

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

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

    其中编号是每个人独有的一个4位数的编号;分别是该编号对应的这个人的父母的编号(如果已经过世,则显示-1);k0k≤)是该人的子女的个数;孩子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

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    
    const int maxn = 1e5 + 10;
    int N;
    int f[maxn], vis[maxn];
    vector<int> peo;
    
    struct Node{
        double square = 0.0;
        vector<int> v;
        vector<int> vv;
        double ave;
        int fir;
        double num = 0;
    }node[maxn], line[maxn];
    
    bool cmp(const Node &a, const Node &b) {
        if((a.square / (1.0 * a.vv.size())) != (b.square / (1.0 * b.vv.size())))
            return (a.square / (1.0 * a.vv.size())) > (b.square / (1.0 * b.vv.size()));
        else return a.v[0] < b.v[0];
    }
    
    void init() {
        for(int i = 0; i < maxn; i ++)
            f[i] = i;
    }
    
    int Find(int x) {
        if(f[x] != x) f[x] = Find(f[x]);
        return f[x];
    }
    
    void Merge(int x, int y) {
        int fx = Find(x);
        int fy = Find(y);
    
        if(fx != fy)
            f[fx] = fy;
    }
    
    int main() {
        scanf("%d", &N);
        init();
        for(int i = 0; i < N; i ++) {
            int man, fa, mot;
            scanf("%d%d%d", &man, &fa, &mot);
            if(fa != -1) Merge(man, fa);
            if(mot != -1) Merge(man, mot);
    
            if(!vis[man]) peo.push_back(man), vis[man] = 1;
            if(!vis[fa] && fa != -1) peo.push_back(fa), vis[fa] = 1;
            if(!vis[mot] && mot != -1) peo.push_back(mot), vis[mot] = 1;
    
            int K;
            scanf("%d", &K);
            if(K) {
                for(int k = 0; k < K; k ++) {
                    int x;
                    scanf("%d", &x);
                    if(!vis[x]) peo.push_back(x), vis[x] = 1;
                    Merge(man, x);
                }
            }
    
            double T, S;
            cin >> T >> S;
            node[man].num = T, node[man].square = S;
        }
    
        int cnt = 0;
        for(int i = 0; i < peo.size(); i ++) {
            if(f[peo[i]] == peo[i])
                cnt ++;
    
            line[Find(peo[i])].num += node[peo[i]].num;
            line[Find(peo[i])].square += node[peo[i]].square;
            line[Find(peo[i])].vv.push_back(peo[i]);
            if(line[Find(peo[i])].v.size() == 0) line[Find(peo[i])].v.push_back(peo[i]);
            else {
                if(peo[i] < line[Find(peo[i])].v[0]) {
                    line[Find(peo[i])].v.pop_back();
                    line[Find(peo[i])].v.push_back(peo[i]);
                }
            }
    
        }
    
        printf("%d
    ", cnt);
    
        sort(line, line + 10000, cmp);
    
        vector<Node> ans;
    
        for(int i = 0; i < 10000; i ++) {
            if(line[i].v.size() == 0) continue;
            ans.push_back(line[i]);
        }
    
        sort(ans.begin(), ans.end(), cmp);
        for(int i = 0; i < ans.size(); i ++)
            printf("%04d %d %.3lf %.3lf
    ", ans[i].v[0], ans[i].vv.size(), 1.0 * ans[i].num / ans[i].vv.size(), ans[i].square / (1.0 * ans[i].vv.size()));
    
        return 0;
    }
    

      debug 一个小时 真的是要死人了 希望比赛的时候不要这样啊啊啊啊 才 25 分的题啊

  • 相关阅读:
    Asp.net弹出浏览器客户端确认对话框代码 Carlwave
    VS 2005 与SQL Server 2005整合优势在哪里?(from csdn.net) Carlwave
    如何让搜索引擎收录我的站点 Carlwave
    超强扩展性的DNNDotNetNuke模块功能分类列表(from 中国DNN) Carlwave
    DotNetNuke命名空间概述 Carlwave
    Most Popular Questions and Answers on ASP.NET Whidbey(from asp.net forums,write by ASP.NET Team) Carlwave
    火箭官方宣告麦蒂缺阵五周 季后赛前景蒙上阴影 Carlwave
    asp.net有效使用缓存(转) Carlwave
    《Business Rules Engine Overview》《业务规则引擎概述》write by Mark Kamoski Carlwave
    中国详细省市县自治区名称列表(含access数据库和sql2000备份数据库) Carlwave
  • 原文地址:https://www.cnblogs.com/zlrrrr/p/10610800.html
Copyright © 2011-2022 走看看