家庭房产(模拟)

给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数、人均房产面积及房产套数。

输入格式:

输入第一行给出一个正整数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
",num);
93     for(int i=1;i<=num;i++)
94     {
95         printf("%04d %d %.3f %.3f
",P[i].id,P[i].ch,P[i].num,P[i].S);
96     }
97     
98     return 0;
99 }

-

原文地址:https://www.cnblogs.com/jiamian/p/12484115.html