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. 芒果TV 视频真实的地址获取

    # coding=utf-8 import requests import json import re import os import urlparse import random vid = r ...

  2. 去除TFS版本控制

    对于曾经做过TFS版本控制的项目,在版本控制服务不可用的时候,依然会在每次打开项目的时候都提示:当前项目是版本控制的项目,但是当前版本控制不可用,balabala的信息,如果是需要进行版本控制的项目在 ...

  3. 从一个局长使用BS系统的无奈看测试点

    今天我点名买了个B/S系统,听说只要有浏览器就能用.我最讨厌装客户端了,用浏览器就是方便啊. 下面就是我使用这个系统碰到的麻烦事: 我登录失败的时候没有任何提示,这没什么,反正提示也只是说失败…… 进 ...

  4. linux(vi)常用命令

    常用操作 系统命令 查看主机名 hostname 修改主机名(重启后无效) hostname yang 修改主机名(重启后永久生效) vi /ect/sysconfig/network 修改IP(重启 ...

  5. 虚拟机 ubuntu 16.04

    下载地址:https://www.ubuntu.com/download/desktop 使用虚拟机直接安装

  6. Centos简介

    Centos作为主流的一种Linux操作系统,以后项目中,比如后期Redis,以及部署一些项目,会把Centos作为服务器操作系统,我们选用Centos,主要是免费,以及稳定. Centos详细介绍, ...

  7. 生成Insert语句的存储过程

    ) drop procedure [dbo].[spGenInsertSQL] GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO )) as b ...

  8. GitHub正式启用声明

    0x00 说明 GitHub账号很早之前就已经注册,几经常识都没有能够好好的将这座宝库应用好,实在是汗颜.今天特地将GitHub重新拾起,以后一定要好好使用这个利器,不要荒废了. 0x01 内容 Gi ...

  9. Radon变换——MATLAB

    算法说明: 图像的Radon变换是每个像素的Radon变换的总和. 该算法首先将图像中的像素分成四个子像素,并分别投影每个子像素,如下图所示. 根据投影位置和箱体中心之间的距离,每个子像素的贡献按比例 ...

  10. const理解

    const int * a4 = &a1; ///const data,non-const pointer int * const a5 = &a1; ///non-const dat ...