1114 Family Property (25 分)

Disclaimer: This article is a blogger original article, follow the CC 4.0 BY-SA copyright agreement, reproduced, please attach the original source link and this statement.
This link: https://blog.csdn.net/weixin_42582136/article/details/102640134

1114 Family Property (25 分)
This time, you are supposed to help us collect the data for family-owned property. Given each person’s family members, and the estate(房产)info under his/her own name, we need to know the size of each family, and the average area and number of sets of their real estate.

Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (≤1000). Then N lines follow, each gives the infomation of a person who owns estate in the format:

ID Father Mother k Child
​1
​​ ⋯Child
​k
​​ M
​estate
​​ Area

where ID is a unique 4-digit identification number for each person; Father and Mother are the ID’s of this person’s parents (if a parent has passed away, -1 will be given instead); k (0≤k≤5) is the number of children of this person; Child
​i
​​ 's are the ID’s of his/her children; M
​estate
​​ is the total number of sets of the real estate under his/her name; and Area is the total area of his/her estate.

Output Specification:
For each case, first print in a line the number of families (all the people that are related directly or indirectly are considered in the same family). Then output the family info in the format:

ID M AVG
​sets
​​ AVG
​area
​​

where ID is the smallest ID in the family; M is the total number of family members; AVG
​sets
​​ is the average number of sets of their real estate; and AVG
​area
​​ is the average area. The average numbers must be accurate up to 3 decimal places. The families must be given in descending order of their average areas, and in ascending order of the ID’s if there is a tie.

Sample Input:
10
6666 5551 5552 1 7777 1 100
1234 5678 9012 1 0002 2 300
8888 -1 -1 0 1 1000
2468 0001 0004 1 2222 1 500
7777 6666 -1 0 2 300
3721 -1 -1 1 2333 2 150
9012 -1 -1 3 1236 1235 1234 1 100
1235 5678 9012 0 1 50
2222 1236 2468 2 6661 6662 1 300
2333 -1 3721 3 6661 6662 6663 1 100
Sample Output:
3
8888 1 1.000 1000.000
0001 15 0.600 100.000
5551 4 0.750 100.000

Given a person's id, the father of the id, the mother of id, all the children of the id, the number of his estate and the area
number of outputs of the family, the family of the corresponding information

Check and set of applications, Unicom identify all blocks in the minimum output of each link id block, the number of members, the average number of real estate, the average property area

#include<bits/stdc++.h>
using namespace std;
map<string, string>parent, min_;
map<string, int>son, Num, Area;;
string find_(string x) {
	return parent[x] == "" ? x : find_(parent[x]);
}
void union_(string x, string y){
	string x_root = find_(x), y_root = find_(y);
	if (x_root == y_root) return;
	son[x_root] += son[y_root] + 1;
	Num[x_root] += Num[y_root];//有可能两个联通块会合并,所以需要
	Area[x_root] += Area[y_root];//联通块内的值整体赋给另一个连通块
	min_[x_root] = min(min_[x_root] == "" ? x_root : min_[x_root], min_[y_root] == "" ? y_root : min_[y_root]);
	parent[y_root] = x_root;//上面联通块的最小id也是在连通块合并的时候更新
}
int main()
{
	int n, m, num, area;
	cin >> n;
	string id, fa, ma, child;
	for (int i = 0; i < n; i++) {
		cin >> id >> fa >> ma>>m;
		if (ma != "-1") union_(ma, id);
		if (fa != "-1") union_(fa, id);
		for (int j = 0; j < m; j++) {
			cin >> child;
			union_(id, child);
		}
		cin >> num >> area;
		Num[find_(id)] += num;//都分别加到父节点上去
		Area[find_(id)] += area;//同上
	}
	struct family{
		string id;
		double num, set, area;
	};
	vector<family>ret;
	for (auto& it : parent)
		if (it.second == ""){
			if (min_[it.first] == "") min_[it.first] = it.first;
			double total = son[it.first] + 1;
			double ave_set = Num[it.first] / total, ave_area = Area[it.first] / total;
			ret.push_back(family{ min_[find_(it.first)],total,ave_set,ave_area });
		}
	sort(ret.begin(), ret.end(), [](family& a, family& b) {
		return a.area != b.area ? a.area > b.area:a.id < b.id;});
	cout << ret.size() << endl;
	for (auto& it : ret)
		printf("%s %.0f %.3f %.3f\n", it.id.c_str(), it.num, it.set, it.area);
	return 0;
}

Guess you like

Origin blog.csdn.net/weixin_42582136/article/details/102640134