【PAT】A1114 Family Property (25 point(s))


Author: CHEN, Yue
Organization: 浙江大学
Time Limit: 200 ms
Memory Limit: 64 MB
Code Size Limit: 16 KB

A1114 Family Property (25 point(s))

This time, you are supposed to help us collect the data for family-owned property. Given each person’s family members, and the estate(房产)info under his/her own name, we need to know the size of each family, and the average area and number of sets of their real estate.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (≤1000). Then N lines follow, each gives the infomation of a person who owns estate in the format:

ID Father Mother k Child​1​​ ⋯Child​k​​ M​estate​​ Area

where ID is a unique 4-digit identification number for each person; Father and Mother are the ID’s of this person’s parents (if a parent has passed away, -1 will be given instead); k (0≤k≤5) is the number of children of this person; Child​i​​ 's are the ID’s of his/her children; M​estate​​ is the total number of sets of the real estate under his/her name; and Area is the total area of his/her estate.

Output Specification:

For each case, first print in a line the number of families (all the people that are related directly or indirectly are considered in the same family). Then output the family info in the format:

ID M AVG​sets​​ AVG​area
​​
where ID is the smallest ID in the family; M is the total number of family members; AVG​sets
​​ is the average number of sets of their real estate; and AVG​area​​ is the average area. The average numbers must be accurate up to 3 decimal places. The families must be given in descending order of their average areas, and in ascending order of the ID’s if there is a tie.

Sample Input:

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

Sample Output:

3
8888 1 1.000 1000.000
0001 15 0.600 100.000
5551 4 0.750 100.000

Code

#include <stdio.h>
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
struct NODE{
    int id;
    double aveares,aveestate;
};
bool cmp(NODE a,NODE b){
    if(a.aveares==b.aveares)    return a.id<b.id;
    else    return a.aveares>b.aveares;
}
map<int, int> estate,are;
int father[10000],cluCnt[10000],appear[10000];
vector<int> root,familymenber[10000];
vector<NODE> res;
int findFather(int x){
    if(x==father[x])    return x;
    else{
        int F=findFather(father[x]);
        father[x]=F;
        return F;
    }
}
void Union(int a,int b){
    int faA=findFather(a),faB=findFather(b);
    if(faA!=faB)    father[faA]=faB;
}
int main(){
    int n,id,fa,mo,k,child,mestate,area;
    scanf("%d",&n);
    for(int i=0;i<10000;i++)    father[i]=i;
    for(int i=0;i<n;i++){
        scanf("%d %d %d %d",&id,&fa,&mo,&k);
        appear[id]=1;
        if(mo!=-1){
            Union(id,mo);
            appear[mo]=1;
        }
        if(fa!=-1){
            Union(id,fa);
            appear[fa]=1;
        }
        for(int j=0;j<k;j++){
            scanf("%d",&child);
            Union(child,id);
            appear[child]=1;
        }
        scanf("%d %d",&mestate,&area);
        estate[id]=mestate;
        are[id]=area;
    }
    for(int i=0;i<10000;i++){
        if(appear[findFather(i)]==1){
            cluCnt[findFather(i)]++;	//对一个集合中的元素计数,存在编号根节点编号的位置
            familymenber[findFather(i)].push_back(i);	//将一个集合的元素存在一起(为了取编号最小)
        }
    }
    for(int i=0;i<10000;i++){
        if(cluCnt[i]>0){
            root.push_back(i);
        }
    }
    for(int i=0;i<root.size();i++){
        sort(familymenber[root[i]].begin(),familymenber[root[i]].end());
        NODE temp;
        temp.id=familymenber[root[i]][0];
        temp.aveares=0;
        temp.aveestate=0;
        for(int j=0;j<10000;j++){
            if(findFather(j)==root[i]){
                temp.aveestate+=estate[j];
                temp.aveares+=are[j];
            }
        }
        temp.aveares=(double)temp.aveares/cluCnt[root[i]];
        temp.aveestate=(double)temp.aveestate/cluCnt[root[i]];
        res.push_back(temp);
    }

    sort(res.begin(),res.end(),cmp);
    printf("%d\n",root.size());
    for(int i=0;i<res.size();i++){
        printf("%.4d %d %.3f %.3f\n",res[i].id,cluCnt[findFather(res[i].id)],res[i].aveestate,res[i].aveares);
    }
    return 0;
}

Analysis

-已知每个家庭的父母,孩子,其自己名下的房产数和名下房产面积。

-求每个家庭的中最小ID号以及人口数,人均房产面积和房产套数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值