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. nginx 实现mysql的负载均衡【转】

    默认Nginx只支持http的反向代理,要想nginx支持tcp的反向代理,还需要在编译时增加tcp代理模块支持,即nginx_tcp_proxy_module 下面操作步骤只让nginx支持tcp_ ...

  2. ActiveMQ 使用场景

    ActiveMQ 安装测试就不做介绍了,下面我说说ActiveMQ 使用场景.(松耦合与ActiveMQ) 1.非均匀应用集成 ActiveMQ 中间件用Java语言编写,因此自然提供Java客户端 ...

  3. node项目中用到的一些模块

    1.http模块,用来搭建服务器 代码,简单服务器实现 var http = require('http'); http.createServer(function (request, respons ...

  4. Git系统学习网址

    https://code.csdn.net/help/CSDN_Code/progit/zh/07-customizing-git/01-chapter7

  5. linux下快速安装emacs方法

    背景 在公司工作的时候经常需要在很多服务器之间切换,而公司的服务器上一般都没emacs,因此总结一下快速安装emacs的方法. 最简单的是直接使用yum安装,但是有两个问题,一个是有的生产服务器直接没 ...

  6. POJ 2186 Popular Cows(强联通分量)

    题目链接:http://poj.org/problem?id=2186 题目大意:    每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种 ...

  7. Oracle工作笔记

    重命名表 RENAME PUB_ORDER_DATE_RES TO PUB_ORDER_DATA_RES; 新增字段 ); 删除字段 ALTER TABLE PUB_ORDER_DATA_RES DR ...

  8. SSIS 学习之旅 第一个SSIS 示例(二)

    这一章还是继上一章例子 进行一些小的知识扩展.主要是为了让大家更快的上手SSIS. 概要设计:    1.按用户组生成CSV文件到Pending目录下,    2.移动Pending目录下的CSV文件 ...

  9. 批处理命令篇--配置免安装mysql

    免安装版的mysql是进行软件绿色发布的绝佳助手,本文介绍一种使用批处理命令自动配置mysql的方法. (1)建立三个文件,分别是:service install.bat,temp.txt,updat ...

  10. DotNetOpenAuth实践之搭建验证服务器

    系列目录: DotNetOpenAuth实践系列(源码在这里) DotNetOpenAuth是OAuth2的.net版本,利用DotNetOpenAuth我们可以轻松的搭建OAuth2验证服务器,不废 ...