家庭房产(模拟)
给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数、人均房产面积及房产套数。
输入格式:
输入第一行给出一个正整数N(≤ 1000),随后N行,每行按下列格式给出一个人的房产:
编号 父 母 k 孩子1 ... 孩子k 房产套数 总面积
其中编号
是每个人独有的一个4位数的编号;父
和母
分别是该编号对应的这个人的父母的编号(如果已经过世,则显示-1
);k
(0<=k≤5)是该人的子女的个数;孩子i
是其子女的编号。
输出格式:
首先在第一行输出家庭个数(所有有亲属关系的人都属于同一个家庭)。随后按下列格式输出每个家庭的信息:
家庭成员的最小编号 家庭人口数 人均房产套数 人均房产面积
其中人均值要求保留小数点后3位。家庭信息首先按人均面积降序输出,若有并列,则按成员编号的升序输出。
输入样例:
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
输出样例:
3 8888 1 1.000 1000.000 0001 15 0.600 100.000 5551 4 0.750 100.000
1 #include <bits/stdc++.h> 2 const int INF=0x3f3f3f3f; 3 typedef long long LL; 4 const double eps =1e-8; 5 const int mod=1e9+7; 6 const int maxn=1e5+10; 7 using namespace std; 8 9 int vis[10005]; 10 int fa[10005]; 11 int son[10005]; 12 int tao[10005]; 13 int S[10005]; 14 set<int> st; 15 16 struct node 17 { 18 int id; 19 int ch; 20 double num; 21 double S; 22 }P[10005]; 23 24 int Find(int x) 25 { 26 return x==fa[x]? x:fa[x]=Find(fa[x]); 27 } 28 29 void Union(int a,int b) 30 { 31 int aa=Find(a); 32 int bb=Find(b); 33 if(aa!=bb) aa<bb?fa[bb]=aa:fa[aa]=bb; 34 } 35 36 bool cmp(node a,node b) 37 { 38 if(a.S==b.S) return a.id<b.id; 39 else return a.S>b.S; 40 } 41 42 int main() 43 { 44 #ifdef DEBUG 45 freopen("sample.txt","r",stdin); 46 #endif 47 48 int n; 49 scanf("%d",&n); 50 memset(son,0,sizeof(son)); 51 for(int i=1;i<=10004;i++) //注意i不是<=n 52 fa[i]=i; 53 for(int i=1;i<=n;i++) 54 { 55 int me,u1,u2,m; 56 scanf("%d %d %d %d",&me,&u1,&u2,&m); 57 vis[me]=1; 58 if(u1!=-1) Union(u1,me),vis[u1]=1; 59 if(u2!=-1) Union(u2,me),vis[u2]=1; 60 for(int i=1;i<=m;i++) 61 { 62 int x; 63 scanf("%d",&x); 64 Union(me,x),vis[x]=1; 65 } 66 scanf("%d %d",&tao[me],&S[me]); 67 68 } 69 for(int i=0;i<=10004;i++)//注意i从0开始 70 { 71 if(vis[i]) 72 { 73 int t=Find(i); 74 son[t]++; 75 st.insert(t); 76 if(t==i) continue; 77 tao[t]+=tao[i]; 78 S[t]+=S[i]; 79 80 } 81 } 82 int num=0; 83 for(auto v:st) 84 { 85 ++num; 86 P[num].id=v; 87 P[num].ch=son[v]; 88 P[num].num=tao[v]*1.0/(double)son[v]; 89 P[num].S=S[v]*1.0/(double)son[v]; 90 } 91 sort(P+1,P+1+num,cmp); 92 printf("%d\n",num); 93 for(int i=1;i<=num;i++) 94 { 95 printf("%04d %d %.3f %.3f\n",P[i].id,P[i].ch,P[i].num,P[i].S); 96 } 97 98 return 0; 99 }
-