PAT甲级1114. Family Property

题意:

这一次,你应该帮我们收集家族财产的数据。鉴于每个人的家庭成员和他/她自己的名字的房地产(房产)信息,我们需要知道每个家庭的规模,以及他们的房地产的平均面积和数量。

输入规格:

每个输入文件包含一个测试用例。对于每种情况,

第一行给出正整数N(<= 1000)。然后N行跟随,每个给出一个拥有庄园的人的信息,格式如下:

ID父亲母亲k Child1 ... Childk M_estate Area

其中ID是每个人唯一的4位数识别号码;父亲和母亲是这个人的父母的身份证件(如果父母已经去世了,

-1将被赋予); k(0 <= k <= 5)是这个人的子女人数;孩子是他/她的孩子的身份证; M_estate是他/她名下的房地产总数;而区域是他/她的遗产的总面积。

输出规格:

对于每种情况,

首先打印出一系列家庭(直接或间接相关的所有人在同一个家庭中被考虑)。然后以以下格式输出家庭信息:

ID M AVG_sets AVG_area

其中ID是家庭中最小的ID; M是家庭成员的总数; AVG_sets是其房地产的平均数量;

AVG_area是平均区域。平均数字必须精确至3位小数。这些家庭必须按其平均面积的降序排列,如果有领带,则按ID的升序排列。

思路:

并查集。数据太多有点乱。

ac代码:

C++

// pat1114.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h" #include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstring>
#include<stdio.h>
#include<map>
#include<cmath>
#include<unordered_map>
#include<unordered_set> using namespace std; const int maxn = 1e5 + 5;
int vis[maxn]; struct UF
{
int pre[maxn];
void init()
{
for (int i = 0; i < maxn; i++)
pre[i] = i;
} int find(int x)
{
return pre[x] == x ? x : find(pre[x]);
} void Union(int a, int b)
{
int x = find(a);
int y = find(b);
if (x == y) return;
pre[max(x, y)] = min(x, y);
}
}uf; struct Person
{
int id = -1;
int dad, mom;
int k;
int child[5];
int estate;
int area;
}person[maxn]; struct Family
{
int minid;
int member_cnt = 0;
int all_estate = 0;
int all_area = 0;
float avg_estate;
float avg_area;
bool operator<(const Family tmp)const {
if (avg_area == tmp.avg_area) {
return minid < tmp.minid;
}
else {
return avg_area > tmp.avg_area;
}
}
}family[maxn]; int main()
{
int n, id;
scanf("%d", &n);
uf.init();
memset(vis, 0, sizeof(vis));
for (int i = 0; i < n; i++)
{
scanf("%d", &id);
person[id].id = id;
scanf("%d %d %d", &person[id].dad, &person[id].mom, &person[id].k);
vis[id] = 1;
if (person[id].dad != -1)
{
uf.Union(id, person[id].dad);
vis[person[id].dad] = 1;
}
if (person[id].mom != -1)
{
uf.Union(id, person[id].mom);
vis[person[id].mom] = 1;
}
for (int j = 0; j < person[id].k; j++)
{
scanf("%d", &person[id].child[j]);
uf.Union(id, person[id].child[j]);
vis[person[id].child[j]] = 1;
}
scanf("%d %d", &person[id].estate, &person[id].area);
} int idArray[maxn];
int cnt = 0;
for (int i = 0; i < maxn; i++)
{
if (vis[i] == 1)
{
idArray[cnt++] = i;
}
}
memset(vis, 0, sizeof(vis));
int u, fa;
for (int i = 0; i < cnt; i++)
{
u = idArray[i];
fa = uf.find(u);
vis[fa] = 1;
family[fa].minid = fa;
family[fa].member_cnt++;
family[fa].all_estate += person[u].estate;
family[fa].all_area += person[u].area;
} int family_num = 0;
for (int i = 0; i < maxn; i++)
{
if (vis[i] == 1)
{
family_num++;
family[i].avg_area = (float)family[i].all_area / family[i].member_cnt;
family[i].avg_estate = (float)family[i].all_estate / family[i].member_cnt;
}
}
sort(family, family + maxn); printf("%d\n", family_num);
for (int i = 0; i < family_num; i++)
{
printf("%04d %d %.3f %.3f\n", family[i].minid, family[i].member_cnt, family[i].avg_estate,
family[i].avg_area);
}
return 0;
}

PAT甲级1114. Family Property的更多相关文章

  1. PAT甲级——1114 Family Property (并查集)

    此文章同步发布在我的CSDN上https://blog.csdn.net/weixin_44385565/article/details/89930332 1114 Family Property ( ...

  2. pat甲级1114

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

  3. PAT甲级——A1114 Family Property【25】

    This time, you are supposed to help us collect the data for family-owned property. Given each person ...

  4. PAT 1114 Family Property[并查集][难]

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

  5. pat甲级题解(更新到1013)

    1001. A+B Format (20) 注意负数,没别的了. 用scanf来补 前导0 和 前导的空格 很方便. #include <iostream> #include <cs ...

  6. PAT甲级题解(慢慢刷中)

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6102219.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  7. 【转载】【PAT】PAT甲级题型分类整理

    最短路径 Emergency (25)-PAT甲级真题(Dijkstra算法) Public Bike Management (30)-PAT甲级真题(Dijkstra + DFS) Travel P ...

  8. PAT 甲级真题题解(63-120)

    2019/4/3 1063 Set Similarity n个序列分别先放进集合里去重.在询问的时候,遍历A集合中每个数,判断下该数在B集合中是否存在,统计存在个数(分子),分母就是两个集合大小减去分 ...

  9. PAT甲级目录

    树(23) 备注 1004 Counting Leaves   1020 Tree Traversals   1043 Is It a Binary Search Tree 判断BST,BST的性质 ...

随机推荐

  1. ClientDataset 三层 var and out arguments must match parameter

    ​​​将Delphi升级到10.1.2后,从客户端传ClientDataset的Delta数据到服务端程序时,出现var and out arguments must match parameter错 ...

  2. ORACLE表空间查询和管理【转】

    红色是自由指定的~~--查询表空间SELECT D.TABLESPACE_NAME,       SPACE "SUM_SPACE(M)",       SPACE - NVL(F ...

  3. COM组件服务访问权限

    解决办法 :添加ASP.NET权限访问COM组件服务. IIS 5 上为 {MACHINE}\ASPNET IIS 6 和 IIS 7 上为网络服务:NETWORK SERVICE IIS 7.5 上 ...

  4. Jenkins无法安装插件或首次安装插件界面提示Offline

    一.首先点击系统管理 二.点击插件管理 三.选择高级管理 四.将升级站点中的https改成http即可

  5. JUnit基本介绍

    一.什么是单元测试 单元测试(Unit  Testing)是指在计算机编程中,针对程序模块来进行正确性检验的测试工作.单元测试的特点如下: ※ 程序单元是应用最小的可测试部件,通常采用基于类或者类的方 ...

  6. 十二、springcloud之展示追踪数据 Sleuth+zipkin

    一.Zipkin简介 Zipkin是Twitter的一个开源项目,它基于Google Dapper实现.我们可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的REST API接口来辅助我们 ...

  7. RabbitMQ--Publish/Subscribe(五)

    上篇文章中,我们实现了不同consumer接收不同级别的日志,这篇文章中,不以日志级别,使用不同日志来源.比如kernel.*.*.critical. 这就要使用topic exchange完成了.将 ...

  8. 06 Frequently Asked Questions (FAQ) 常见问题解答 (常见问题)

    Frequently Asked Questions (FAQ) Origins 起源 What is the purpose of the project? What is the history ...

  9. python网络编程-多进程multiprocessing

    一:mutilprocess简介 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理. 用户界面可以更加吸引人,这样比如用户点击了一个按钮去 ...

  10. 正则表达式之你不知道的replace

    我们都知道js内置类String提供了一个replace方法,可以把指定字符串替换为另一个字符串,他的基础用法如下: var str="hello world"; var str= ...