PAT甲级1114. Family Property

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;
}


原文地址:https://www.cnblogs.com/weedboy/p/7351124.html