7-11 家庭房产(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

【题意】

RT

【思路】

这道题相当于让我们对有关系的人进行合并,然后输出所有种族的信息,很容易想到利用并查集

对于有家庭关系的,利用join函数把他们合并起来,并在join中把num,tao,area进行传递,由于题目要求了输出时输出该家庭编号最小的那个,所以在传递的时候往小的方向传递即可

有一个问题需要注意,在加某个人a的套数和面积数的时候,不应该直接加在a自己上面,应该加在find(a)上,因为后续在更新传递a的时候,用到的也是find后的结果,如果放在a上面,就传不到祖先上面了

最后输出的时候只要输出find(i)==i且出现过的人的信息就好了

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mst(a,b) memset((a),(b),sizeof(a))
const int maxn=10005;int n,m;
int vis[maxn];
int pre[maxn],num[maxn];
int tao[maxn],area[maxn];struct node
{int id,num,tao,area;
}a[maxn];bool cmp(node a,node b){if(a.num*b.area==a.area*b.num) return a.id<b.id;return a.area*b.num>a.num*b.area;
}void init(){for(int i=0;i<maxn;i++){pre[i]=i;num[i]=1;}
}int find(int x){int t,r=x;while(x!=pre[x]){x=pre[x];}while(r!=x){t=pre[r];pre[r]=x;r=t;}return x;
}void join(int a,int b){vis[a]=vis[b]=1;int A=find(a);int B=find(b);if(A==B) return;if(A<B){pre[B]=A;num[A]+=num[B];tao[A]+=tao[B];area[A]+=area[B];//num[B]=tao[B]=area[B]=0;} else{pre[A]=B;num[B]+=num[A];tao[B]+=tao[A];area[B]+=area[A];//num[A]=tao[A]=area[A]=0;}
}int main(){init();scanf("%d",&n);for(int i=0;i<n;i++){int tmp[10];int a,b,c,k;scanf("%d%d%d%d",&a,&b,&c,&k);vis[a]=1;for(int j=0;j<k;j++) scanf("%d",&tmp[j]);int x,y;scanf("%d%d",&x,&y);tao[find(a)]+=x,area[find(a)]+=y;if(b!=-1)join(a,b);if(c!=-1)join(a,c);for(int j=0;j<k;j++) join(a,tmp[j]);}int cnt=0;for(int i=0;i<maxn;i++){if(find(i)==i&&vis[i]){a[cnt].id=i;a[cnt].num=num[i];a[cnt].tao=tao[i];a[cnt++].area=area[i];}}sort(a,a+cnt,cmp);printf("%d\n",cnt);for(int i=0;i<cnt;i++){printf("%04d %d %.3f %.3f\n",a[i].id,a[i].num,a[i].tao*1.0/a[i].num,a[i].area*1.0/a[i].num);}
}

7-11 家庭房产(25 分) 【并查集】相关推荐

  1. C++学习之路 | PTA(天梯赛)—— L2-007 家庭房产 (25分)(带注释)(并查集)(精简)

    L2-007 家庭房产 (25分) 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(≤1000),随后N行,每行按 ...

  2. 【CCCC】L2-007 家庭房产 (25分),并查集,结构统计

    problem L2-007 家庭房产 (25分) 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(≤1000), ...

  3. 7-56 家庭房产 (25 分)

    7-56 家庭房产 (25 分) 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(≤1000),随后N行,每行按下 ...

  4. PAT题解-1118. Birds in Forest (25)-(并查集模板题)

    如题... #include <iostream> #include <cstdio> #include <algorithm> #include <stri ...

  5. PAT A 1118. Birds in Forest (25)【并查集】

    并查集合并 #include<iostream> using namespace std; const int MAX = 10010; int father[MAX],root[MAX] ...

  6. 习题3.11 表达式转换 (25分)

    算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间.请设计程序将中缀表达式转换为后缀表达式. 输入格式: 输入在一行中给出不含空 ...

  7. 团体程序设计天梯赛-练习集(并查集)

    L2-007 家庭房产 (25 分) #include <iostream> #include <vector> #include <algorithm> usin ...

  8. C++学习之路 | PTA(甲级)—— 1114 Family Property (25分)(带注释)(并查集)(精简)

    1114 Family Property (25分) This time, you are supposed to help us collect the data for family-owned ...

  9. 数据结构与算法A实验六图论---7-6 家庭房产(并查集)

    给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(≤1000),随后N行,每行按下列格式给出一个人的房产: 编号 父 ...

最新文章

  1. centos(linux) 下如何查看端口占用情况及杀死进程
  2. chrome开发者工具各种骚技巧
  3. spring mvc学习(34):restful的delete
  4. 1.5编程基础之循环控制_45金币
  5. 原神创意工坊工具箱2.0源码-小程序前端源码
  6. PCL之多可视化窗口
  7. 获取虚拟账号列表失败啥意思_「图」Windows 10 Build 18963发布:可显GPU温度 支持重命名虚拟桌面...
  8. Linux命令总结:file
  9. PHP里面用ichartjs,ichartjs插件的使用
  10. 计算机Excel应用案例,Excel VBA在Office中的应用案例
  11. java-房屋出租系统(项目)
  12. 纯JS实现倒序九九乘法表 for循环
  13. edge浏览器internet选项的设置方法
  14. [OpenAirInterface实战-5] :OAI支持的5G gNB功能集
  15. 《增长黑客》- 读书笔记(四)增长黑客循环
  16. 网站盈利模式分析分类
  17. 阿里P6工作四年,女友跑路、晋升无望、年薪45W买不起房,加班加到焦虑!
  18. 1. 无线纳米传感器网络和纳米物联网络:背景、架构、特征
  19. MyBatis面试题1
  20. LMK、ZMK、TMK、ZAK等密钥对照表

热门文章

  1. java 级联删除_级联删除 - Asher鑫与 - 博客园
  2. hyperledger fabric v2.4环境搭建及区块链项目开发
  3. 企业级架构apache/PHP/tomcat架构应用实战-高俊峰-专题视频课程
  4. logback - 自定义日志脱敏组件,一种不错的脱敏方案
  5. typescript中函数_如何在TypeScript中合成Canvas动画
  6. 串口通信基本知识及实例开发1(Com口通信简介)
  7. 2022赛季RoboMaster 空中机器人六轴无人机云台程序框架代码开源
  8. 微信转发或分享朋友圈带缩略图、描述的实现方法
  9. 乐趣国学—品读《弟子规》中的“亲仁”之道
  10. 矩阵的幂运算--蓝桥杯