资讯详情

天梯赛--L2-007 家庭房产 (25 分)(并查集)

L2-007 家庭房产 (25 分)

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

输入格式:

输入第一行给出正整数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

并收集一个并不难的问题,只要创建合适的数组或其他问题来存储相应的数量,并收集基本操作find,merge熟悉会用,那么这个问题就没问题了。set自动排序是默认插入数据,unordered_set中间元素未按任何特定顺序排序

#include<bits/stdc  .h> using namespace std; int p[10010],n,m; int id,fa,ma,k; unordered_set<int>pe;///每个人的编号  int housenum[10010],area[10010];  int cnt[10010];///每户人口总数    int find(int x)//1/int {  if(x!=p[x])  p[x]=find(p[x]);  return p[x]; } void merge(int x,int y) {  int px=find(x);  int py=find(y);  if(px<py)swap(px,py);  p[px]=py;//y小充当树根  }  struct node {  int id;  int num;////家庭人口  double rjs;///人均房地产套数   double rjm; ///人均房地产面积  bool operator<(const node &t)  {   if(rjm==t.rjm)   return id<t.id;   else   return rjm>t.rjm;  }  }; vector<node>v;  int main() {  for(int i=0;i<=10010;i  )p[i]=i;    cin>>n;  while(n--)  {   cin>>id>>fa>>ma>>k;   pe.insert(id);   if(fa!=-1)   {    pe.insert(fa);    merge(id,fa);   }   if(ma!=-1)   {    pe.insert(ma);    merge(id,ma);   }   int child;///儿童编号    while(k--)   {    cin>>child;    pe.insert(child);    merge(id,child);   }   int nh,ta;///房产套数,总面积   cin>>nh>>ta;      housenum[id] =nh;   area[id] =ta;  }      for(auto id:pe)  {   int pid=find(id);   cnt[pid]  ;//以pid为祖宗,他们家的人数      if(id!=pid)//他们家的 房地产套数,总面积总和    {    housenum[pid] =housenum[id];    area[pid] =area[id];   }  }      ////加入每个家庭的祖先vector里,排序输出  for(auto id:pe)  {   if(id==p[id])   v.push_back({id,cnt[id],((double)housenum[id]/(double)cnt[id]),((double)area[id]/(double)cnt[id])});  }    sort(v.begin(),v.end());    cout<<v.size()<<endl;  for(auto p:v)  {   printf("d %d %.3lf %.3lf\n",p.id,p.num,p.rjs,p.rjm);  }    return 0; }

标签: 三极管pxt8550贴片sot

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台