pat L2-007

7-11 家庭房产 (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
#include<bits/stdc++.h>
using namespace std;
struct person{
    int fid,mid,k,son[6],h,area;
} a[10001]= {0};
struct family{
    int id,sum;
    double hs,areas;
};
set<int>e;
int n,f[10001],b[10001]= {0};

bool cmp(family x,family y)
{
    if(x.areas!=y.areas)return x.areas>y.areas;
    else if(x.id!=y.id)return x.id<y.id;
}
int findfa(int x)
{
    return f[x]==x?x:findfa(f[x]);
}
void uni(int x,int y)
{
    if(x==-1||y==-1) return;
    b[y]=1;
    int x1=findfa(x);
    int y1=findfa(y);
    if(x1>y1) f[x1]=y1;
    else if(x1<y1) f[y1]=x1;
}
int main()
{
    for(int i=0; i<10001; i++)f[i]=i;
    scanf("%d",&n);
    for(int i=0; i<n; i++)
    {
        int id,fid,mid,k,h,area;
        scanf("%d%d%d%d",&id,&fid,&mid,&k);
        a[id].fid=fid,a[id].mid=mid,a[id].k=k,b[id]=1,uni(id,fid),uni(id,mid);
        for(int j=0; j<k; j++) scanf("%d",&a[id].son[j]),uni(id,a[id].son[j]);
        scanf("%d%d",&h,&area);
        a[id].h=h,a[id].area=area;
    }
    for(int i=0; i<10001; i++)
    if(b[i])
        {
            e.insert(findfa(i));
            if(i!=findfa(i)) a[findfa(i)].h+=a[i].h,a[findfa(i)].area+=a[i].area,b[findfa(i)]++;
        }
    printf("%d\n",e.size());
    family z[e.size()];
    int i=0;
    set<int>::iterator it;
    for(it=e.begin(); it!=e.end(); it++)z[i].id=*it,z[i].sum=b[*it],z[i].hs=a[*it].h*1.0/b[*it],z[i++].areas=a[*it].area*1.0/b[*it];
    sort(z,z+e.size(),cmp);
    for(int j=0; j<e.size(); j++) printf("%04d %d %.3f %.3f\n",z[j].id,z[j].sum,z[j].hs,z[j].areas);
    return 0;
}

原创文章 4 获赞 1 访问量 92

猜你喜欢

转载自blog.csdn.net/weixin_45436102/article/details/106178855