題目描述
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
題意
給出n個人的個人信息,包括自己id,父母id,孩子個數及id,房產數目以及面積,
求每個家族中最小id號以及平均每個人的房產數目和平均面積。按照平均面積降序排序,id升序排序。
思路
對人進行並查集,之後找到每個人的父節點,然後將個人的房產數目和麪積加到父節點上。
代碼如下
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e4+5;
struct peo
{
int min_id;
int num_st;
int num;
double area;
};
// 記錄每個父節點在v中的位置
int vis[maxn];
// id 是否存在
int is_exist[maxn];
// 每個人的房產數目
int num_st[maxn];
// 每個人的面積
double area[maxn];
vector<peo> v;
bool compare(peo a,peo b)
{
double avga=a.area/a.num;
double avgb=b.area/b.num;
if(avga!=avgb) return avga>avgb;
return a.min_id<b.min_id;
}
int n;
int a[maxn];
void init()
{
for (int i=0;i<maxn;i++) a[i]=i;
}
int finds(int x)
{
if(x==a[x]) return x;
return a[x]=finds(a[x]);
}
void unit(int x,int y)
{
int px=finds(x);
int py=finds(y);
if(px!=py) a[px]=py;
}
int main()
{
memset (num_st,0,sizeof(num_st));
memset (area,0,sizeof(area));
memset (vis,-1,sizeof(vis));
scanf("%d",&n);
init();
for (int i=0;i<n;i++)
{
int id;
scanf("%d",&id);
if(is_exist[id]==0) is_exist[id]=1;
for (int j=0;j<2;j++)
{
int x;
scanf("%d",&x);
if(x==-1) continue;
unit(x,id);
if(is_exist[x]==0) is_exist[x]=1;
}
int num_c;
scanf("%d",&num_c);
for (int j=0;j<num_c;j++)
{
int x;
scanf("%d",&x);
unit(x,id);
if(is_exist[x]==0) is_exist[x]=1;
}
scanf("%d%lf",&num_st[id],&area[id]);
}
for (int i=0,j=0;i<maxn;i++)
{
if(is_exist[i]==0) continue;
int fa=finds(i);
if(vis[fa]==-1)
{
vis[fa]=j++;
peo temp;
temp.area=area[i];
temp.num_st=num_st[i];
temp.min_id=i;
temp.num=1;
v.push_back(temp);
}
else
{
v[vis[fa]].min_id=min(v[vis[fa]].min_id,i);
v[vis[fa]].num_st+=num_st[i];
v[vis[fa]].area+=area[i];
v[vis[fa]].num++;
}
}
sort(v.begin(),v.end(),compare);
printf("%d\n",v.size());
for (int i=0;i<v.size();i++)
{
printf("%04d %d %.3lf %.3lf\n",v[i].min_id,v[i].num,v[i].num_st*1.0/v[i].num,v[i].area/v[i].num);
}
return 0;
}