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

输入格式:
输入第一行给出一个正整数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

思路: 典型的并查集问题,首先要了解并查集的基本概念,再回过头来做这道题。发现,总体上核心运用了并查集然后多用几个数组计算数据。细节上,使用People结构体保存每个家庭的输入信息,使用并查集加家庭合并到一起,合并的同时让最小编号当根节点。使用isroot数组标记根节点的位置,根据true的个数确定总共有3个大家庭。使用Family结构体保存平均房子数目,平均面积个数。Family数组主要是针对根节点使用。所有的人数都用flag数组标记,如果是true,那么根节点的人数统计部分就加1。

#include<iostream>
#include<algorithm>
using namespace std;const int MAXN = 10005;
struct People{int id;int house_num;int house_area;
}P[MAXN];struct Family{int id;double house_sum;double house_area;int people_sum;double house_per;double area_per;
}F[MAXN];bool isroot[MAXN];
int farther[MAXN];
int find(int x);
bool flag[MAXN];void Union(int a, int b);bool mycmp(Family a, Family b){if(a.area_per == b.area_per){return a.id < b.id;}else{return a.area_per > b.area_per;}}
int main(){int n;cin >> n;//init for(int i = 1; i <= MAXN; i++){farther[i] = i;}for(int i = 0; i < n; i++){int ba,ma;cin >> P[i].id >> ba >> ma;flag[P[i].id] = true;if(ba != -1){Union(ba,P[i].id);flag[ba] = true;}if(ma !=-1){Union(ma,P[i].id);flag[ma] = true;}//kidsint k;cin >> k;for(int j = 0; j < k; j++){int kid;cin >> kid;Union(kid,P[i].id);flag[kid] = true;}int h_n,h_a;cin >> h_n >> h_a;P[i].house_num = h_n;P[i].house_area = h_a;}//将所有信息汇总到根节点for(int i = 0; i < n; i++){int root = find(P[i].id);F[root].id = root;F[root].house_sum += P[i].house_num;F[root].house_area += P[i].house_area;isroot[root] = true;} //家庭人数for(int i = 0; i <= MAXN; i++){if(flag[i]){int root = find(i);F[root].people_sum++;}} //家庭数int ans = 0;for(int i = 0; i <= MAXN; i++){if(isroot[i]){F[i].house_per = 1.0*F[i].house_sum/F[i].people_sum;F[i].area_per = 1.0*F[i].house_area/F[i].people_sum;ans++;}} cout << ans << endl;//sort(F,F+MAXN,mycmp);int count = 0;Family result[MAXN];for(int i = 0; i <= MAXN; i++){if(isroot[i]){result[count++] = F[i];}}sort(result, result+count,mycmp);for(int i = 0; i < count; i++){printf("%04d %d %.3f %.3f\n",result[i].id,result[i].people_sum,result[i].house_per,result[i].area_per);}return 0;
}
int find(int x){if(x == farther[x]){return x;}else{return find(farther[x]);}
}void Union(int a, int b){int fa = find(a);int fb = find(b);if(fa != fb){if(fa < fb){farther[fb] = fa;}else{farther[fa] = fb;}}
}

L2-007 家庭房产 (25 point(s))相关推荐

  1. CCCC L2 007 家庭房产 并查集

    最开始看到这个题,想不到只用并查集,在某一个如果同时又两个其他家庭包括的人怎么办,所有开了一个home类,想通过Home之间的合并解决这个问题,最后由于内容过于庞大而超时. 参考网上的思路用并查集可以 ...

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

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

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

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

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

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

  5. 7-11 家庭房产(25 分) 【并查集】

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

  6. L2-007. 家庭房产

    L2-007. 家庭房产 题目链接:https://www.patest.cn/contests/gplt/L2-007 并查集 初学,看这题的时候完全没有什么好的想法,参考了@yinzm的blog用 ...

  7. PTA 家庭房产 (图论,暴搜)

    PTA 家庭房产 (图论,暴搜) 题目详情: 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(≤1000),随后N ...

  8. L2-007 家庭房产分数 25作者 陈越单位 浙江大学

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

  9. pta l2-7(家庭房产)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805068539215872 题意:给定n个人的信息,包括其编号 ...

  10. L2-007. 家庭房产-PAT团体程序设计天梯赛GPLT

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

最新文章

  1. 快速提升性能的SQL语句,建议收藏
  2. Codeforces Round #556 (Div. 1Div. 2)
  3. ROS中常见坐标系定义及基本单位
  4. dcdc升压计算器excel_两款低压DC-DC升压转换器应用电路
  5. 右浮动的顺序是反过来的,html中第一个是最后显示,而最后一个会在第一个显示。
  6. 2018优秀讲师排行榜出炉,将受邀出席开发者大会!
  7. 永恒之蓝攻击处置方法
  8. python plc fx5u_FX5U系列三菱PLC型号选型一览表
  9. Linux 快速修改某个分区的名称/标签
  10. Typora导出word文档自动生成目录
  11. 电商产品展示,选360°全景还是3D展示?
  12. 信号量与生产者消费者问题
  13. php日志,monolog - PHP 日志神器
  14. \u202E与\u202D的RLO与LRO (QQ消息后缀 喵!)
  15. el表达式ne什么意思_EL表达式的基本语法及运算符
  16. 计算机服务器 芯片,服务器芯片是什么意思?服务器芯片有什么用
  17. error C1076: 编译器限制 : 达到内部堆限制;使用 /Zm 指定更高的限制
  18. GoF设计模式(十二) - 享元模式
  19. 计算机如何存数? 2 8 10 16进制的转换。
  20. 软件测试面试(名企摸底:阿里,腾讯,360)

热门文章

  1. Lync问题解决之前端服务器Wmf2008R2错误
  2. 6.gloox 之 MessageHandler
  3. 聚簇索引和非聚簇索引的原理
  4. 第四季-专题12-按键驱动程序设计
  5. c++中模板的实现(模板类和模板函数)
  6. matlab_exercise(2)----输入一个三位数,依次输出其个位数字,十位数字,百位数字...
  7. JavaScript中变量的类型
  8. ie8下a标签中的图片出现边框
  9. IOS之UI--自定义按钮实现代理监听点击事件
  10. OSPF 常见错误与排查方法