首页 > 学院 > 开发设计 > 正文

家庭房产(并查集)

2019-11-08 02:14:27
字体:
来源:转载
供稿:网友
家庭房产   (25分)

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

输入格式:

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表