L2-007 家庭房产 (25 分)
 

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

输入格式:

输入第一行给出一个正整数N(≤),随后N行,每行按下列格式给出一个人的房产:

  1. 编号 k 孩子1 ... 孩子k 房产套数 总面积

其中编号是每个人独有的一个4位数的编号;分别是该编号对应的这个人的父母的编号(如果已经过世,则显示-1);k(0k≤)是该人的子女的个数;孩子i是其子女的编号。

输出格式:

首先在第一行输出家庭个数(所有有亲属关系的人都属于同一个家庭)。随后按下列格式输出每个家庭的信息:

  1. 家庭成员的最小编号 家庭人口数 人均房产套数 人均房产面积

其中人均值要求保留小数点后3位。家庭信息首先按人均面积降序输出,若有并列,则按成员编号的升序输出。

输入样例:

  1. 10
  2. 6666 5551 5552 1 7777 1 100
  3. 1234 5678 9012 1 0002 2 300
  4. 8888 -1 -1 0 1 1000
  5. 2468 0001 0004 1 2222 1 500
  6. 7777 6666 -1 0 2 300
  7. 3721 -1 -1 1 2333 2 150
  8. 9012 -1 -1 3 1236 1235 1234 1 100
  9. 1235 5678 9012 0 1 50
  10. 2222 1236 2468 2 6661 6662 1 300
  11. 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

并查集经典题 要稍微改写一下unite函数

PTA经典特色题目 算法不难 倒腾起来麻烦 还给要整个排序 还考察了STL的用法(= =)

推荐做

unite要改写一下 id最小的作为根节点

  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <map>
  4. #include <set>
  5. #include <algorithm>
  6. using namespace std;
  7. int N, M, K;
  8. const int si = ;
  9. int par[si];
  10. int cnt[si];
  11. double area[si];
  12. int housenum[si];
  13. bool vis[si];
  14. struct node {
  15. int id, num;
  16. double avgnum, avgarea;
  17.  
  18. }no[si];
  19.  
  20. bool cmp (node a, node b) {
  21. if (a.avgarea != b.avgarea) return a.avgarea > b.avgarea;
  22. return a.id < b.id;
  23. }
  24. using namespace std;
  25.  
  26. int find(int x) {
  27. if (x == par[x]) return par[x];
  28. return par[x] = find(par[x]);
  29. }
  30. bool same(int x, int y) {
  31. return find(x) == find(y);
  32. }
  33. void unite(int x, int y) {
  34. x = find(x);
  35. y = find(y);
  36. if (x == y) return;
  37. if (x < y) {
  38. par[y] = par[x];
  39. }
  40. else {
  41. par[x] = par[y];
  42. }
  43. }
  44. int main() {
  45. cin >> N;
  46. for (int i = ; i < si; i++) par[i] = i;
  47.  
  48. int f, m, id, k, tp;
  49. for (int i = ; i < N; i++) {
  50. cin >> id >> f >> m >> k;
  51. if (f != -) {
  52. unite(id, f);
  53. vis[f] = ;
  54. }
  55. if (m != -) {
  56. unite(id, m);
  57. vis[m] = ;
  58. }
  59. vis[id] = ;
  60. for (int j = ; j < k; j++) {
  61. scanf("%d", &tp);
  62. unite(id, tp);
  63. vis[tp] = ;
  64. }
  65. cin >> housenum[id] >> area[id];
  66. }
  67. set<int> st;
  68. for (int i = ; i < si; i++) {
  69. if (!vis[i]) continue;
  70. int x = find(i);//这个家庭
  71. cnt[x]++;//人口数++
  72. if (x != i) {
  73. area[x] += area[i];
  74. housenum[x] += housenum[i];
  75. }
  76. st.insert(x);
  77. }
  78. set<int>:: iterator it = st.begin();
  79. int count = ;
  80. while (it != st.end()) {
  81. int x = *it;
  82. no[count].id = x;
  83. no[count].num = cnt[x];
  84. no[count].avgnum = housenum[x] * 1.0 / cnt[x];
  85. no[count++].avgarea = area[x] * 1.0 / cnt[x];
  86. it++;
  87. }
  88. cout << count << endl;
  89. sort (no, no + count, cmp);
  90. for (int i = ; i < count; i++) {
  91. printf("%04d %d %.3f %.3f\n", no[i].id, no[i].num, no[i].avgnum, no[i].avgarea);
  92. }
  93. return ;
  94. }

L2-007 家庭房产 (25 分)的更多相关文章

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

    题目链接 题解:并查集把一个家的并在一起,特殊的一点是编号大的并到小的去.这个题有个坑编号可能为0000,会错数据3和5. 1 #include<bits/stdc++.h> 2 usin ...

  2. PAT L2-007 家庭房产

    https://pintia.cn/problem-sets/994805046380707840/problems/994805068539215872 给定每个人的家庭成员和其自己名下的房产,请你 ...

  3. 【刷题-PAT】A1114 Family Property (25 分)

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

  4. 团体程序设计天梯赛-练习集L2-007. 家庭房产

    L2-007. 家庭房产 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定每个人的家庭成员和其自己名下的房产,请你统计出每个 ...

  5. L2-006 树的遍历 (25 分) (根据后序遍历与中序遍历建二叉树)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805069361299456 L2-006 树的遍历 (25 分 ...

  6. 1114 Family Property (25 分)

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

  7. 天梯赛 L2-007. (并查集) 家庭房产

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

  8. PATL2-007. 家庭房产-并查集

    L2-007. 家庭房产 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定每个人的家庭成员和其自己名下的房产,请你统计出每个 ...

  9. pat 团体天梯赛 L2-007. 家庭房产

    L2-007. 家庭房产 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产 ...

随机推荐

  1. 爬虫(九)scrapy框架简介和基础应用

    概要 scrapy框架介绍 环境安装 基础使用 一.什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能 ...

  2. 德邦总管 修改oracle数据库用户密码的方法

    WIN+R打开运行窗口,输入cmd进入命令行: 输入sqlplus ,输入用户名,输入口令(如果是超级管理员SYS的话需在口令之后加上as sysdba)进入sql命令行:    连接成功后,输入“s ...

  3. 读javascript高级程序设计-目录

    javascript高级编程读书笔记系列,也是本砖头书.感觉js是一种很好上手的语言,不过本书细细读来发现了很多之前不了解的细节,受益良多.<br/>本笔记是为了方便日后查阅,仅作学习交流 ...

  4. scrapy框架学习第一天

    今天是学习的第一天: 知识总结如下: 1,调试器相当于原料出口地(URL提供) 2,scrapy相当于中间加工商(具有销售权利)封装URL为request(请求) 3,下载器使用request(请求) ...

  5. HTCVIVE定位器更新之后,定位器指示灯不亮,重置基站固件操作指南。

    HTCVIVE定位器更新之后,定位器指示灯不亮,固件修复指南 建议您重置基站固件,操作如下:请您使用手机来拍照运行中基站的“激光发射器”面板,并且数一下是否有17颗LED灯,如果没有17颗,则基本可以 ...

  6. linux 虚拟机配置固定ip

    参考这边博客: https://blog.csdn.net/u014466635/article/details/80284792 但是这个有个小问题,就是没有配置dns,导致连不上公网 /etc/s ...

  7. vs code编写的时候自动回车的原因

    今天在书写一个空白的scss文件的时候,刚打2个字就自动回车换行了: 测试了几次,发现了规律就是输入停下来0.5秒左右就会自动换行,比如,打了2个中文,再连续打一个句子,键盘虽然在动,但是vs cod ...

  8. 网络请求get和post的区别

    网络请求get和post的区别 其实本文更应该放在HTTP相关的分类,但是目前我并没有开设这一个分类专栏,so临时储存在HTML分类吧 Get和post是HTTP请求的两种基本方式 get是从服务器上 ...

  9. python学习博客地址集合。。。

    python学习博客地址集合...   老师讲课博客目录 http://www.bootcdn.cn/bootstrap/  bootstrap cdn在线地址 http://www.cnblogs. ...

  10. js 回调

    function getTittleLableData(callback) { $.ajax({ type : 'POST', url : ctx + '/feeInf/getDataValue', ...