给定每一个人的家庭成员和其本身名下的房产,请你统计出每一个家庭的人口数、人均房产面积及房产套数。node
输入第一行给出一个正整数N(≤1000),随后N行,每行按下列格式给出一我的的房产:
编号 父 母 k 孩子1 … 孩子k 房产套数 总面积
其中编号是每一个人独有的一个4位数的编号;父和母分别是该编号对应的这我的的父母的编号(若是已通过世,则显示-1);k(0≤k≤5)是该人的子女的个数;孩子i是其子女的编号。ios
首先在第一行输出家庭个数(全部有亲属关系的人都属于同一个家庭)。随后按下列格式输出每一个家庭的信息:
家庭成员的最小编号 家庭人口数 人均房产套数 人均房产面积
其中人均值要求保留小数点后3位。家庭信息首先按人均面积降序输出,如有并列,则按成员编号的升序输出。web
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 100svg
3
8888 1 1.000 1000.000
0001 15 0.600 100.000
5551 4 0.750 100.000spa
这题我用了并查集和set来作,首先将同一个家庭的成员用并查集连起来,同时将读入的不是-1的成员编号放入到set集合s中,set有去重的功能,因此最后获得的set的大小就是成员的个数,而后对s中存的成员编号进行遍历,将find(成员编号)获得的编号放入set集合q中,最后获得的q的大小就是家庭的数量,而家庭人口数,人均房产套数,人均面积也能够在对s中存的成员编号遍历的同时进行计算。code
#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #include<vector> #include<set> using namespace std; const int maxn=1e4+50; set<int> s; set<int> q; set<int>::iterator it; int vis[maxn]; struct fang{ int number=0; double size=0; }v[maxn]; struct node{ int id; int num=0; int mun=0; double area=0; }f[maxn]; bool cmp(node a,node b) { if(a.area==b.area){ return a.id<b.id; } return a.area>b.area; } int find(int x) { if(vis[x]==x){ return x; } else{ vis[x]=find(vis[x]); return vis[x]; } } void merge(int a,int b) { int m=find(a); int p=find(b); if(m==p){ return ; } else{ if(p<m){ vis[m]=p; } else{ vis[p]=m; } return ; } } int main() { int n,k; cin>>n; for(int i=0;i<10000;i++){ vis[i]=i; } while(n--){ int a,b,c; cin>>a>>b>>c; s.insert(a); cin>>k; for(int i=0;i<k;i++){ int x; cin>>x; s.insert(x); merge(x,a); } if(b!=-1){ s.insert(b); merge(a,b); } if(c!=-1){ s.insert(c); merge(a,c); } cin>>v[a].number>>v[a].size; } int e[maxn]={0}; for(it=s.begin();it!=s.end();it++){ q.insert(find(*it)); e[find(*it)]+=v[*it].size; f[find(*it)].num++; f[find(*it)].mun+=v[*it].number; f[find(*it)].id=find(*it); } for(it=q.begin();it!=q.end();it++){ f[find(*it)].area=1.0*e[find(*it)]/f[find(*it)].num; } cout<<q.size()<<endl; sort(f,f+10000,cmp); int cnt=0; for(int i=0;i<10000;i++){ cnt++; printf("%04d %d %.3lf %.3lf\n",f[i].id,f[i].num,1.0*f[i].mun/f[i].num,f[i].area); if(cnt==q.size()){ break; } } return 0; }