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
分析:纯粹的模拟题,按题目要求做即可,一开始一直过不了,后来加了个数组vis表示该人还存活,另外3、4、5测试点里有00000这个人要注意。
/** * Copyright(c) * All rights reserved. * Author : Mered1th * Date : 2019-02-27-13.50.01 * Description : A1114 */ #include<cstdio> #include<cstring> #include<iostream> #include<cmath> #include<algorithm> #include<string> #include<unordered_set> #include<map> #include<vector> #include<set> using namespace std; ; struct Family{ ; //m是人口数 ,Avgarea=; ,area=;//总套数,总面积 bool flag=false; }family[maxn]; struct Node{ int id,f,m,k; vector<int> child; double Msets,Area; }node[maxn]; int father[maxn]; int find_Father(int x){ int a=x; while(x!=father[x]){ x=father[x]; } while(a!=father[a]){ int z=a; a=father[a]; father[z]=x; } return x; } void Union(int a,int b){ int faA=find_Father(a); int faB=find_Father(b); if(faA!=faB){ if(faA<faB){ father[faB]=faA; } else if(faA>faB){ father[faA]=faB; } } } bool cmp(Family a,Family b){ if(a.Avgarea!=b.Avgarea) return a.Avgarea>b.Avgarea; else return a.id<b.id; } bool vis[maxn]={false}; int main(){ #ifdef ONLINE_JUDGE #else freopen("1.txt", "r", stdin); #endif int n,k,id,child; scanf("%d",&n); ;i<maxn;i++) father[i]=i; ;i<n;i++){ scanf("%d",&id); scanf("%d%d%d",&node[id].f,&node[id].m,&k); vis[id]=true; node[id].id=id; ){ Union(id,node[id].f); vis[node[id].f]=true; } ){ Union(id,node[id].m); vis[node[id].m]=true; } ;j<k;j++){ scanf("%d",&child); node[id].child.push_back(child); vis[child]=true; Union(id,child); } scanf("%lf%lf",&node[id].Msets,&node[id].Area); } ;i<maxn;i++){ int faI=find_Father(node[i].id); if(vis[faI]){ family[faI].id=faI; family[faI].area+=node[i].Area; family[faI].sets+=node[i].Msets; family[faI].flag=true; } } ; ;i<maxn;i++){ if(vis[i]){ family[find_Father(i)].m++; } if(family[i].flag==true){ num++; } } ;i<maxn;i++){ ){ family[i].Avgarea=family[i].area/family[i].m; family[i].Avgsets=family[i].sets/family[i].m; } } sort(family,family+maxn,cmp); cout<<num<<endl; ;i<num;i++){ printf("%04d %d %.3f %.3f\n",family[i].id,family[i].m,family[i].Avgsets,family[i].Avgarea); } ; }