链接:
题目:
给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数、人均房产面积及房产套数。
输入格式:
输入第一行给出一个正整数N(≤),随后N行,每行按下列格式给出一个人的房产:
编号 父 母 k 孩子1 ... 孩子k 房产套数 总面积
其中编号
是每个人独有的一个4位数的编号;父
和母
分别是该编号对应的这个人的父母的编号(如果已经过世,则显示-1
);k
(0k
≤)是该人的子女的个数;孩子i
是其子女的编号。
输出格式:
首先在第一行输出家庭个数(所有有亲属关系的人都属于同一个家庭)。随后按下列格式输出每个家庭的信息:
家庭成员的最小编号 家庭人口数 人均房产套数 人均房产面积
其中人均值要求保留小数点后3位。家庭信息首先按人均面积降序输出,若有并列,则按成员编号的升序输出。
输入样例:
106666 5551 5552 1 7777 1 1001234 5678 9012 1 0002 2 3008888 -1 -1 0 1 10002468 0001 0004 1 2222 1 5007777 6666 -1 0 2 3003721 -1 -1 1 2333 2 1509012 -1 -1 3 1236 1235 1234 1 1001235 5678 9012 0 1 502222 1236 2468 2 6661 6662 1 3002333 -1 3721 3 6661 6662 6663 1 100
输出样例:
38888 1 1.000 1000.000
#include#include #include #include #include #include #include using namespace std;typedef long long ll;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int maxn=1e4+10;int n,p1,p2,k,d;int fa[maxn],vis[maxn];struct node{ int id; double ans,sum;}kk[maxn];struct he{ int id,num,ans,sum; double avgans,avgsum;}final[maxn];void init(){ for(int i=0;i<10000;i++){ fa[i]=i; final[i].id=0; final[i].num=0; final[i].ans=0; final[i].sum=0; final[i].avgans=0; final[i].avgsum=0; }}int cmp(he a,he b){ if(a.avgsum==b.avgsum) return a.id b.avgsum;}int find(int x){ if(fa[x]==x) return x; else return fa[x]=find(fa[x]);}void unite(int x,int y){ x=find(x); y=find(y); if(x==y) return; else fa[y]=x;}int main(){ init(); scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d%d",&kk[i].id,&p1,&p2); vis[kk[i].id]=1; if(p1!=-1){ unite(kk[i].id,p1); vis[p1]=1; } if(p2!=-1){ unite(kk[i].id,p2); vis[p2]=1; } scanf("%d",&k); for(int j=1;j<=k;j++){ scanf("%d",&d); unite(kk[i].id,d); vis[d]=1; } scanf("%lf%lf",&kk[i].ans,&kk[i].sum); } for(int i=1;i<=n;i++){ int tmp=find(kk[i].id); final[tmp].ans+=kk[i].ans; final[tmp].sum+=kk[i].sum; } for(int i=0;i<10000;i++){ if(vis[i]){ fa[i]=find(i); if(!final[fa[i]].num) final[fa[i]].id=i; final[fa[i]].num++; final[fa[i]].avgans=final[fa[i]].ans*1.0/final[fa[i]].num; final[fa[i]].avgsum=final[fa[i]].sum*1.0/final[fa[i]].num; } } int ans=0; sort(final,final+10000,cmp); for(int i=0;i<10000;i++){ if(final[i].num) ans++; else break; } printf("%d\n",ans); for(int i=0;i
0001 15 0.600 100.0005551 4 0.750 100.000
思路: 重点在于找到每个家庭 用并查集去把一个家庭的都连到一个祖先下面 每次读入父母和孩子都做一遍并查集 麻烦之处在于要处理很多数据 较为繁琐 先把同一个家庭下的父母和孩子都连到一起 然后再循环一遍 更新家庭的总房数和总面积 再一遍循环去求平均 然后输出即可
代码: