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

输入格式:

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

分析:用并查集。分别用两个结构体数组,一个data用来接收数据,接收的时候顺便实现了并查集的操作union,另一个数组ans用来输出最后的答案,因为要计算家庭人数,所以用visit标记所有出现过的结点,对于每个结点的父结点,people++统计人数。标记flag == true,计算true的个数cnt就可以知道一共有多少个家庭。排序后输出前cnt个就是所求答案~

#include <cstdio>
#include <algorithm>
using namespace std;
struct DATA {int id, fid, mid, num, area;int cid[10];
}data[1005];
struct node {int id, people;double num, area;bool flag = false;
}ans[10000];
int father[10000];
bool visit[10000];
int find(int x) {while(x != father[x])x = father[x];return x;
}
void Union(int a, int b) {int faA = find(a);int faB = find(b);if(faA > faB)father[faA] = faB;else if(faA < faB)father[faB] = faA;
}
int cmp1(node a, node b) {if(a.area != b.area)return a.area > b.area;elsereturn a.id < b.id;
}
int main() {int n, k, cnt = 0;scanf("%d", &n);for(int i = 0; i < 10000; i++)father[i] = i;for(int i = 0; i < n; i++) {scanf("%d %d %d %d", &data[i].id, &data[i].fid, &data[i].mid, &k);visit[data[i].id] = true;if(data[i].fid != -1) {visit[data[i].fid] = true;Union(data[i].fid, data[i].id);}if(data[i].mid != -1) {visit[data[i].mid] = true;Union(data[i].mid, data[i].id);}for(int j = 0; j < k; j++) {scanf("%d", &data[i].cid[j]);visit[data[i].cid[j]] = true;Union(data[i].cid[j], data[i].id);}scanf("%d %d", &data[i].num, &data[i].area);}for(int i = 0; i < n; i++) {int id = find(data[i].id);ans[id].id = id;ans[id].num += data[i].num;ans[id].area += data[i].area;ans[id].flag = true;}for(int i = 0; i < 10000; i++) {if(visit[i])ans[find(i)].people++;if(ans[i].flag)cnt++;}for(int i = 0; i < 10000; i++) {if(ans[i].flag) {ans[i].num = (double)(ans[i].num * 1.0 / ans[i].people);ans[i].area = (double)(ans[i].area * 1.0 / ans[i].people);}}sort(ans, ans + 10000, cmp1);printf("%d\n", cnt);for(int i = 0; i < cnt; i++)printf("%04d %d %.3f %.3f\n", ans[i].id, ans[i].people, ans[i].num, ans[i].area);return 0;
}

L2-007. 家庭房产-PAT团体程序设计天梯赛GPLT相关推荐

  1. L2-005 集合相似度-PAT团体程序设计天梯赛GPLT

    题目来源:团体程序设计天梯赛-练习集 题目地址:L2-005 集合相似度 题目大意 给定 nnn 个集合,然后有 kkk 次询问,每次询问都要求出 Nc/Nt×100%N_c / N_t \times ...

  2. L1-079 天梯赛的善良 (20 分)-PAT 团体程序设计天梯赛 GPLT

    天梯赛是个善良的比赛.善良的命题组希望将题目难度控制在一个范围内,使得每个参赛的学生都有能做出来的题目,并且最厉害的学生也要非常努力才有可能得到高分. 于是命题组首先将编程能力划分成了 106个等级( ...

  3. L1-078 吉老师的回归 (15 分)-PAT 团体程序设计天梯赛 GPLT

    曾经在天梯赛大杀四方的吉老师决定回归天梯赛赛场啦! 为了简化题目,我们不妨假设天梯赛的每道题目可以用一个不超过 500 的.只包括可打印符号的字符串描述出来,如:Problem A: Print &q ...

  4. [Python] L1-052 2018我们要赢-PAT团体程序设计天梯赛GPLT

    2018年天梯赛的注册邀请码是"2018wmyy",意思就是"2018我们要赢".本题就请你用汉语拼音输出这句话. 输入格式: 本题没有输入. 输出格式: 在第 ...

  5. L1-052 2018我们要赢-PAT团体程序设计天梯赛GPLT

    2018年天梯赛的注册邀请码是"2018wmyy",意思就是"2018我们要赢".本题就请你用汉语拼音输出这句话. 输入格式: 本题没有输入. 输出格式: 在第 ...

  6. L3-007. 天梯地图-PAT团体程序设计天梯赛GPLT

    本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至少存在一条可达路线. 输 ...

  7. L3-011 直捣黄龙 (30 分)-PAT 团体程序设计天梯赛 GPLT

    本题是一部战争大片 -- 你需要从己方大本营出发,一路攻城略地杀到敌方大本营.首先时间就是生命,所以你必须选择合适的路径,以最快的速度占领敌方大本营.当这样的路径不唯一时,要求选择可以沿途解放最多城镇 ...

  8. L2-031 深入虎穴 (25 分)-PAT 团体程序设计天梯赛 GPLT

    著名的王牌间谍 007 需要执行一次任务,获取敌方的机密情报.已知情报藏在一个地下迷宫里,迷宫只有一个入口,里面有很多条通路,每条路通向一扇门.每一扇门背后或者是一个房间,或者又有很多条路,同样是每条 ...

  9. [Python] L1-045 宇宙无敌大招呼-PAT团体程序设计天梯赛GPLT

    据说所有程序员学习的第一个程序都是在屏幕上输出一句"Hello World",跟这个世界打个招呼.作为天梯赛中的程序员,你写的程序得高级一点,要能跟任意指定的星球打招呼. 输入格式 ...

最新文章

  1. python requests模块_Python 爬虫教程 requests 模块
  2. mysql设置定时任务
  3. vorwerk 机器人_福维克(Vorwerk)--吸尘器行业的quot;安利quot;
  4. linux上点时间延时,Linux上时间和定时器
  5. 【es】将 elasticsearch 写入速度优化到极限
  6. 在线修改Schema
  7. TortoiseSVN修改服务器地址的方法
  8. ++x 和 x++的区别
  9. 推荐几个Linux镜像下载网站
  10. C#从入门到精通之第一篇: C#概述与入门
  11. Ethereum Swarm bzz 升级
  12. Android px转dip px转sp法则
  13. Java程序员工资为什么越来越高?
  14. 怎么添改计算机程序,注册表怎么样添改注册表, – 手机爱问
  15. NW集成打包 自定义图标及注意事项
  16. 执行git reset --hard后文件的恢复
  17. 三星A7100手机更换电池方法拆电池方法
  18. 评论区抽奖程序2.0
  19. python显示变量值_Python 中如何打印变量值
  20. VS2017中自用部分插件的设置的翻译或功能介绍—— Viasfora设置(一)

热门文章

  1. android手势创建及识别
  2. cassandra学习笔记五
  3. 用MyEclipse JPA创建项目(四)
  4. Computer Science Theory for the Information Age-4: 一些机器学习算法的简介
  5. Dijstra算法-------为了纪念,等以后看的时候方便
  6. Oracle 修改 MEMORY_TARGET
  7. Tapioca:linux上同gtalk语音通信
  8. AMD CPU驱动被曝漏洞,可使 KASLR崩溃、密码泄露
  9. SonicWall 又爆已遭利用的 0day?!
  10. Mozilla 修复已遭利用的两个火狐浏览器 0day