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
", family_num);
for (int i = 0; i < family_num; i++)
{
printf("%04d %d %.3f %.3f
", family[i].minid, family[i].member_cnt, family[i].avg_estate,
family[i].avg_area);
}
return 0;
}