PAT (Advanced Level) Practice 1114 Family Property (25 分)

題目描述

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

題意

給出n個人的個人信息,包括自己id,父母id,孩子個數及id,房產數目以及面積,
求每個家族中最小id號以及平均每個人的房產數目和平均面積。按照平均面積降序排序,id升序排序。

思路

對人進行並查集,之後找到每個人的父節點,然後將個人的房產數目和麪積加到父節點上。

代碼如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e4+5;
struct peo
{
    int min_id;
    int num_st;
    int num;
    double area;
};
// 記錄每個父節點在v中的位置
int vis[maxn];
// id 是否存在
int is_exist[maxn];
// 每個人的房產數目
int num_st[maxn];
// 每個人的面積
double area[maxn];
vector<peo> v;
bool compare(peo a,peo b)
{
    double avga=a.area/a.num;
    double avgb=b.area/b.num;
    if(avga!=avgb) return avga>avgb;
    return a.min_id<b.min_id;
}
int n;
int a[maxn];
void init()
{
    for (int i=0;i<maxn;i++) a[i]=i;
}
int finds(int x)
{
    if(x==a[x]) return x;
    return a[x]=finds(a[x]);
}
void unit(int x,int y)
{
    int px=finds(x);
    int py=finds(y);
    if(px!=py) a[px]=py;
}
int main()
{
    memset (num_st,0,sizeof(num_st));
    memset (area,0,sizeof(area));
    memset (vis,-1,sizeof(vis));
    scanf("%d",&n);
    init();
    for (int i=0;i<n;i++)
    {
        int id;
        scanf("%d",&id);
        if(is_exist[id]==0) is_exist[id]=1;
        for (int j=0;j<2;j++)
        {
            int x;
            scanf("%d",&x);
            if(x==-1) continue;
            unit(x,id);
            if(is_exist[x]==0) is_exist[x]=1;
        }
        int num_c;
        scanf("%d",&num_c);
        for (int j=0;j<num_c;j++)
        {
            int x;
            scanf("%d",&x);
            unit(x,id);
            if(is_exist[x]==0) is_exist[x]=1;
        }
        scanf("%d%lf",&num_st[id],&area[id]);
    }
    for (int i=0,j=0;i<maxn;i++)
    {
        if(is_exist[i]==0) continue;
        int fa=finds(i);
        if(vis[fa]==-1)
        {
            vis[fa]=j++;
            peo temp;

            temp.area=area[i];
            temp.num_st=num_st[i];
            temp.min_id=i;
            temp.num=1;
            v.push_back(temp);
        }
        else
        {
            v[vis[fa]].min_id=min(v[vis[fa]].min_id,i);
            v[vis[fa]].num_st+=num_st[i];
            v[vis[fa]].area+=area[i];
            v[vis[fa]].num++;

        }
    }
    sort(v.begin(),v.end(),compare);
    printf("%d\n",v.size());
    for (int i=0;i<v.size();i++)
    {
        printf("%04d %d %.3lf %.3lf\n",v[i].min_id,v[i].num,v[i].num_st*1.0/v[i].num,v[i].area/v[i].num);
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章