給定每個人的家庭成員和其自己名下的房產,請你統計出每個家庭的人口數、人均房產面積及房產套數。
輸入第一行給出一個正整數NN(/le 1000≤1000),隨后NN行,每行按下列格式給出一個人的房產:
編號 父 母 k 孩子1 ... 孩子k 房產套數 總面積其中編號是每個人獨有的一個4位數的編號;父和母分別是該編號對應的這個人的父母的編號(如果已經過世,則顯示-1);k(0/le0≤k/le 5≤5)是該人的子女的個數;孩子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.0000001 15 0.600 100.0005551 4 0.750 100.000#include <iostream>#include <cstdio>#include <cmath>#include <queue>#include <stack>#include <map>#include <algorithm>#include <vector>#include <string>#include <cstring>#include <sstream>using namespace std;int n;int fa[10005];int vis[10005];struct DATA{ int id; int fid; int mid; int k; int cid[10]; int n; int s;}d[1005];void UFset(){ for(int i=0;i<=9999;i++) { fa[i]=i; }}int Find(int x){ if(fa[x]==x) { return x; } else { return fa[x]=Find(fa[x]); }}void Union(int a,int b){ if(a==b) return; int ia=Find(a); int ib=Find(b); if(ia<ib) { fa[ib]=ia; } else { fa[ia]=ib; }}struct ANS{ int id; int num; int n; int s;}ans[10005];struct RES{ int id; int num; double b1; double b2;}res[10005];int cnt;int cmp(RES a,RES b){ if(a.b2==b.b2) { return a.id<b.id; } return a.b2>b.b2;}int main(){ UFset(); scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d%d%d",&d[i].id,&d[i].fid,&d[i].mid); vis[d[i].id]=1; if(d[i].fid!=-1) { vis[d[i].fid]=1; Union(d[i].id,d[i].fid); } if(d[i].mid!=-1) { vis[d[i].mid]=1; Union(d[i].id,d[i].mid); } scanf("%d",&d[i].k); for(int j=0;j<d[i].k;j++) { scanf("%d",&d[i].cid[j]); if(d[i].cid[j]!=-1) { vis[d[i].cid[j]]=1; Union(d[i].id,d[i].cid[j]); } } scanf("%d%d",&d[i].n,&d[i].s); } for(int i=0;i<10000;i++) { ans[i].id=-1; } for(int i=0;i<n;i++) { int ID=Find(d[i].id); ans[ID].id=ID; ans[ID].n+=d[i].n; //統計房產總數 // ans[ID].num //人口總數不能統計 ans[ID].s+=d[i].s; } for(int i=0;i<10000;i++) //統計家庭人口總數 { if(vis[i]==1) { ans[Find(i)].num+=1; } } for(int i=0;i<10000;i++) { if(ans[i].id>=0) { res[cnt].id=ans[i].id; res[cnt].num=ans[i].num; res[cnt].b1=ans[i].n*1.0/ans[i].num; res[cnt].b2=ans[i].s*1.0/ans[i].num; cnt++; } } sort(res,res+cnt,cmp); PRintf("%d/n",cnt); for(int i=0;i<cnt;i++) { printf("%04d %d %.3f %.3f/n",res[i].id,res[i].num,res[i].b1,res[i].b2); } return 0;}
新聞熱點
疑難解答