一、题目
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 Child1⋯Childk Mestate 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; Childi's are the ID
's of his/her children; Mestate 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
AVGsets AVGarea
where ID
is the smallest ID in the family; M
is the total number of family members; AVGsets is the average number of sets of their real estate; and AVGarea 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
二、题目大意
给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数、人均房产面积及房产套数。
三、考点
并查集
四、注意
1、并查集都是套路;
2、本题的难点在于定义struct,保存房产数量和面积,比较繁琐。
五、代码
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
#include<set>
#define N 10010
using namespace std;
int fa[N];
void init() {
for (int i = 0; i < N; ++i)
fa[i] = i;
}
int findFather(int x) {
int a = x;
while (x != fa[x])
x = fa[x];
while (a != fa[a])
{
int z = a;
a = fa[a];
fa[z] = x;
}
return x;
}
void unionFather(int a, int b) {
int x = findFather(a);
int y = findFather(b);
if (x < y)
fa[y] = x;
else
fa[x] = y;
}
struct node {
int id, family_num;
int house_num, house_area;
float avg_house_num, avg_house_area;
};
bool cmp(node n1, node n2) {
if (n1.avg_house_area != n2.avg_house_area)
return n1.avg_house_area > n2.avg_house_area;
else
return n1.id < n2.id;
}
int main() {
//init
init();
//read
int n;
cin >> n;
//union
bool show[N] = { false };
vector<int> vec_house_num(N, 0), vec_house_area(N, 0);
for (int i = 0; i < n; ++i) {
int a, b, c, m;
cin >> a >> b >> c >> m;
show[a] = true;
if (b != -1) {
unionFather(a, b);
show[b] = true;
}
if (c != -1) {
unionFather(a, c);
show[c] = true;
}
//child
for (int j = 0; j < m; ++j) {
int child;
cin >> child;
unionFather(a, child);
show[child] = true;
}
//house
cin >> vec_house_num[a] >> vec_house_area[a];
}
//cluster
int cluster_num = 0;
vector<node> vec(N);
for (int i = 0; i < N; ++i) {
if (show[i] == true) {
//num
if (fa[i] == i)
cluster_num++;
//house
int id = findFather(i);
vec[id].id = id;
vec[id].family_num++;
vec[id].house_num += vec_house_num[i];
vec[id].house_area += vec_house_area[i];
vec[id].avg_house_num = vec[id].house_num*1.0 / vec[id].family_num;
vec[id].avg_house_area = vec[id].house_area*1.0 / vec[id].family_num;
}
}
//output
sort(vec.begin(), vec.end(), cmp);
cout << cluster_num << endl;
for (int i = 0; i < cluster_num; ++i) {
printf("%04d %d %.3f %.3f\n", vec[i].id, vec[i].family_num, vec[i].avg_house_num, vec[i].avg_house_area);
}
system("pause");
return 0;
}