L2-007 家庭房产 (25 分)(并查集)

简介: 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

结尾无空行


输出样例:

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

结尾无空行


#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int vis[N],p[N];
//vis用来标记出现过的编号,p用来存父节点
int find(int x)//查找
{
    if(x!=p[x]) p[x]=find(p[x]);
    return p[x];
}
void join(int x,int y)//并查集合并操作,把大的插在小的下面
{
    int fx=find(x);
    int fy=find(y);
    if(fx>fy) p[fx]=fy;
    else p[fy]=fx;
}
struct node1{//存输入数据
    int id,father,mother,child[10],num,area;
}s1[N];
struct node2{//存处理结果
    int id,people,t;//t用来标记家庭个数
    double num,area;
}s2[N];
bool cmp(node2 a,node2 b)//排序规则
{
    if(a.area!=b.area) return a.area>b.area;
    else return a.id<b.id;
}
int main()
{
    int n,k;
    cin>>n;
    for(int i=0;i<N;i++) p[i]=i;//把每个节点的父节点初始化为自己
    for(int i=0;i<n;i++)
    {
        cin>>s1[i].id>>s1[i].father>>s1[i].mother>>k;
        vis[s1[i].id]=1;
        if(s1[i].father!=-1)
        {
            vis[s1[i].father]=1;
            join(s1[i].id,s1[i].father);
        }
        if(s1[i].mother!=-1)
        {
            vis[s1[i].mother]=1;
            join(s1[i].id,s1[i].mother);
        }
        for(int j=0;j<k;j++)
        {
            cin>>s1[i].child[j];
            vis[s1[i].child[j]]=1;
            join(s1[i].id,s1[i].child[j]);
        }
        cin>>s1[i].num>>s1[i].area;
    }
    for(int i=0;i<n;i++)
    {
        int id=find(s1[i].id);//找到每个集合的祖先节点
        s2[id].id=id;
        s2[id].num+=s1[i].num;
        s2[id].area+=s1[i].area;
        s2[id].t=1;//对祖先节点进行标记
    }
    int cnt=0;//队集合进行计数
    for(int i=0;i<N;i++)
    {
        if(vis[i]) s2[find(i)].people++;//记录每个家庭的人数
        if(s2[i].t) cnt++;
    }
    for(int i=0;i<N;i++)
    {
        if(s2[i].t)
        {
            s2[i].num=s2[i].num*1.0/s2[i].people;
            s2[i].area=s2[i].area*1.0/s2[i].people;
        }
    }
    sort(s2,s2+N,cmp);
    cout<<cnt<<endl;
    for(int i=0;i<cnt;i++)
        printf("%04d %d %.3lf %.3lf\n",s2[i].id,s2[i].people,s2[i].num,s2[i].area);
    return 0;
}


目录
相关文章
|
C++
【PTA】​L1-006 连续因子​(C++)
【PTA】​L1-006 连续因子​(C++)
504 0
【PTA】​L1-006 连续因子​(C++)
|
Java C++
部落(pta)(并查集) Java以及C++
部落(pta)(并查集) Java以及C++
139 2
|
存储 人工智能 C++
【PTA】L1-064 估值一亿的AI核心代码(详C++)
【PTA】L1-064 估值一亿的AI核心代码(详C++)
426 1
|
存储
L2-028 秀恩爱分得快 (25 分)(模拟)
L2-028 秀恩爱分得快 (25 分)(模拟)
331 0
|
6天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
15天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
9天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
614 216
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
857 61