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 分的题啊

  • 相关阅读:
    SpringBoot实现原理
    常见Http状态码大全
    forward(转发)和redirect(重定向)有什么区别
    1094. Car Pooling (M)
    0980. Unique Paths III (H)
    1291. Sequential Digits (M)
    0121. Best Time to Buy and Sell Stock (E)
    1041. Robot Bounded In Circle (M)
    0421. Maximum XOR of Two Numbers in an Array (M)
    0216. Combination Sum III (M)
  • 原文地址:https://www.cnblogs.com/zlrrrr/p/10610800.html
Copyright © 2011-2022 走看看