C++学习之路 | PTA(天梯赛)—— 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
输出样例:

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

这题一开始没什么思路,感觉计算量很大,后来参考了别人的代码,恍然大悟,刚开始看的时候可能有点蒙。

#include<iostream>
#include<set>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
const int maxn = 10000;
int pre[maxn];
struct node {//存储开始输入的人的基本信息int id, house;double area;
};
struct family {//输出的家庭结构体int id, number;double house, area;
};
bool cmp(family a, family b)//自定义比较函数
{if (a.area != b.area)return a.area > b.area;else return a.id < b.id;
}
int find(int x)//并查集模板,查找
{while (x != pre[x]) x = pre[x];return x;
}
void merge(int x, int y)//并查集模板,合并
{int a = find(x);int b = find(y);if (a != b) pre[a] = b;
}
int main()
{int n, x;cin >> n;set<int>s;//存储每人的编号,默认升序map<int, node>nodes;//记录人的房产信息for (int i = 0; i < maxn; i++)pre[i] = i;//初始化pre数组for (int i = 0; i < n; i++){int id, p1, p2, k, house, id1;//分别记录编号 父 母 k 孩子1 ... 孩子k 房产套数double area;// 总面积cin >> id >> p1 >> p2 >> k;s.insert(id);//插入idif (p1 != -1)//有爸爸{s.insert(p1);merge(id, p1);}if (p2 != -1)//有妈妈{s.insert(p2);merge(id, p2);}for (int j = 0; j < k; j++)//随后的家庭成员{cin >> id1;s.insert(id1);merge(id1, id);}cin >> house >> area;nodes[id] = node{ id,house,area };//记录该人的家庭信息}set<int>s1;//记录家庭编号(也可以理解记录着每个家庭的老大)map<int, vector<int>>m;//记录家庭编号()和成员编号for (auto it = s.begin(); it != s.end(); it++){int fa = find(*it);m[fa].push_back(*it);s1.insert(fa);}cout << s1.size() << endl;//输出家庭的个数vector<family>v1;for (auto it = s1.begin(); it != s1.end(); it++){int fa = *it;double house = 0, area = 0;for (auto tmp = 0; tmp < m[fa].size(); tmp++)//将每个家庭的成员及其房产计算汇总,放入family结构体中{house += nodes[m[fa][tmp]].house;area += nodes[m[fa][tmp]].area;}v1.push_back(family{ m[fa][0],int(m[fa].size()),house * 1.0 / (int)m[fa].size(),area * 1.0 / (int)m[fa].size() });}sort(v1.begin(), v1.end(), cmp);//进行排序for (int i = 0; i < v1.size(); i++) {printf("%04d %d %.3lf %.3lf", v1[i].id, v1[i].number, v1[i].house, v1[i].area);if (i < v1.size() - 1) puts("");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

是时候不把智能手机叫做电话了:移动AI时代来临!

来源&#xff1a;EET电子工程专辑概要&#xff1a;全新的iPhone X集成了用于人脸识别的神经引擎&#xff0c;但这仅仅是一个开始。全新的iPhone X集成了用于人脸识别的神经引擎&#xff0c;但这仅仅是一个开始。嵌入式神经引擎和专用智能处理器在边缘设备上实现了人工智能(AI)&…

C#中MSMQ消息队列测试疑问

今天我通过C#程序向某台机器发送MQ消息队列,并且已经将目标机器的消息队列设置消息存储限额无限制.我持续的把消息发送到目标机器上,发现只能发送1000条消息,其他的消息无法接收到!!!于是我尝试通过程序把消息队列的一些消息删除掉,最后发现消息队列又多了起来,但是到1000条的时…

Facade 和 Mediator 模式

Facade 和 Mediator 模式

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

1114 Family Property (25分) This time, you are supposed to help us collect the data for family-owned property. Given each person’s family members, and the estate&#xff08;房产&#xff09;info under his/her own name, we need to know the size of each fami…

拥抱AI大趋势,ARM发布两款AI芯片架构

来源&#xff1a;量子位概要&#xff1a;ARM发布了两款针对移动终端的AI芯片架构&#xff0c;物体检测&#xff08;Object Detection&#xff0c;简称OD&#xff09;处理器和机器学习&#xff08;Machine Learning&#xff0c;简称ML&#xff09;处理器。今天&#xff0c;ARM发…

Ubuntu 安装 mysql、sqlite3、postgresql

NAVICAT 官网&#xff1a;http://www.navicat.com.cn/products NAVICAT16 PREMIUM NAVICAT16 &#xff1a;http://zzzzzz.me/post-73329.html Xmanager &#xff1a;https://www.xshellcn.com/ 1、Ubuntu 安装 mysql ubuntu上安装MySQL非常简单只需要几条命令就可以完成。 1…

牡丹园

其实从少林寺去洛阳非常近&#xff0c;当时想赶当天晚上的火车去另一个地方&#xff0c;所以从少林寺又回到郑州火车站&#xff0c;结果没有票&#xff0c;于是取消了。决定在郑州住一晚第二天去洛阳。 看到洛阳路边隔断种的都是这种植物&#xff0c;星星点点很是好看&#xff…

Singleton 和 Monostate 模式

Singleton 和 Monostate 模式 怎样才能使得两个实例表现得像一个对象呢&#xff1f;很简单&#xff0c;只要把所有的变量都变成静态变量即可。 public class Monostate {private static int itsX 0;public Monostate() {}public void setX(final int x) {itsX x;}public int…

十张图看懂未来大数据世界

作者&#xff1a;薄云借智来源&#xff1a;钱塘江大数据随着互联网云时代的来临&#xff0c;大数据与云计算就像一个硬币的正反两面&#xff0c;势必会影响到社会生活的方方面面&#xff0c;改变我们现有的规则和秩序。伴随着大数据与云计算产业的不断发展&#xff0c;未来到底…

MediaWiki初探:安装及使用入门

来源&#xff1a;http://blog.csdn.net/wangnan537/article/details/37743497 MediaWiki是著名的开源wiki引擎&#xff0c;全球最大的wiki项目维基百科(百科词条协作系统)是使用MediaWiki的成功范例&#xff0c;MediaWiki的最大作用在于对知识的归档&#xff0c;可用于构建企业…

科学释梦——意识窗口在记忆模块间的穿越

作者&#xff1a;谢平 中国科学院大学教授 唐代诗人李白曾说&#xff0c;“浮生若梦&#xff0c;为欢几何”&#xff0c;将人生喻为短暂的梦幻。有些人生如梦&#xff0c;有些梦若人生&#xff0c;还有梦想人生......梦——五彩缤纷&#xff0c;诡异神奇&#xff0c;我们每晚都…

asp.net 一个简易权限的小例子设计

asp.net 一个简易权限的小例子设计 近日在阅读一本asp.net的书时&#xff08;国人写的&#xff09;&#xff0c;其中提到了一个简易权限的小例子&#xff0c;感觉说的还是比较清楚&#xff0c;有点代表性&#xff0c;故在此简单介绍下其实现原理其核心是建立起用户、角色&#…

linux 内核与用户空间通信之netlink使用方法

Linux中的进程间通信机制源自于Unix平台上的进程通信机制。Unix的两大分支AT&T Unix和BSD Unix在进程通信实现机制上的各有所不同&#xff0c;前者形成了运行在单个计算机上的System V IPC&#xff0c;后者则实现了基于socket的进程间通信机制。同时Linux也遵循IEEE制定的P…

C++学习之路 | PTA乙级—— 1020 月饼 (25分)(带注释)(精简)

1024 科学计数法 (20分) 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法&#xff0c;其满足正则表达式 [][1-9].[0-9]E[][0-9]&#xff0c;即数字的整数部分只有 1 位&#xff0c;小数部分至少有 1 位&#xff0c;该数字及其指数部分的正负号即使对正数也必定明确…

超级智能城市:更高质量的幸福社会

报告下载链接:https://pan.baidu.com/s/1oAmRK4U 密码:t9qb未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。由互联网进化论作者&#xff0c;计算机博士刘锋与中国科学院虚拟经济与数据科学研究中心石勇、刘颖教授创建…

切洋葱怎么才不流泪?

切洋葱时&#xff0c;由于洋葱有一种挥发物质&#xff0c;常使切菜的人流泪。防止的方法是&#xff1a; 1.在切洋葱前&#xff0c;把切菜刀在冷水中浸一会儿&#xff0c;再切时就不会因受挥发物质刺激而流泪了。 2.将洋葱对半切开后,先泡一下凉水再切,就不会流泪了. 3.放微波炉…

python网络编程——IO多路复用之epoll

来源&#xff1a;http://www.cnblogs.com/maociping/p/5132583.html 1、内核EPOLL模型讲解 此部分参考http://blog.csdn.net/mango_song/article/details/42643971博文并整理 首先我们来定义流的概念&#xff0c;一个流可以是文件&#xff0c;socket&#xff0c;pipe等可以进行…