• L2-007. 家庭房产


    L2-007. 家庭房产

    时间限制
    400 ms
    内存限制
    65536 kB
    代码长度限制
    8000 B
    判题程序
    Standard
    作者
    陈越

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

    输入格式:

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

    分析:这个题目一看就觉得是并查集类型题...但是这个并查集具体应该怎么做就需要仔细想一想了(并查集是用来维护一类关系的集合,所以并查集中的元素就是这类关系)
    主要是用两个结构体解决问题
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=1e5+5;
     4 int fa[maxn];
     5 struct node{
     6     int id;
     7     int f_id;
     8     int m_id;
     9     int ch[6];
    10     int num;
    11     int area;
    12 }a[maxn];
    13 struct note{
    14     int id;
    15     int cnt;
    16     double ave_num;
    17     double ave_area;
    18     bool f;
    19 }ans[maxn];
    20 bool cmp(note ans, note b){
    21     if(ans.ave_area==b.ave_area)    return ans.id<b.id;
    22     else return ans.ave_area>b.ave_area;
    23 }
    24 bool visit[maxn];
    25 int find(int x){
    26     return fa[x]==x?x:fa[x]=find(fa[x]);  //可以压缩路径
    27 }
    28 void Merge(int x, int y){
    29     x=find(x);
    30     y=find(y);
    31     if(x<y)    fa[y]=x;
    32     else if(x>y) fa[x]=y;
    33 }
    34 int n;
    35 void input(){
    36     cin>>n;
    37     for(int i=0; i<maxn; i++)    fa[i]=i;
    38     for(int i=0; i<n; i++){
    39         int m;
    40         cin>>a[i].id>>a[i].f_id>>a[i].m_id>>m;
    41         visit[a[i].id]=true;
    42         if(a[i].f_id!=-1)    {
    43             Merge(a[i].id, a[i].f_id);
    44             visit[a[i].f_id]=true;    
    45         }
    46         if(a[i].m_id!=-1){
    47             Merge(a[i].id, a[i].m_id);
    48             visit[a[i].m_id]=true;
    49         }
    50         for(int j=0; j<m; j++){
    51             cin>>a[i].ch[j];
    52             Merge(a[i].id, a[i].ch[j]);
    53             visit[a[i].ch[j]]=true;
    54         }
    55         cin>>a[i].num>>a[i].area;
    56     }
    57 }
    58 //一开始我在考虑怎么去从一个根节点去找所有它的子节点的信息!后来发现,不一定要从根去找子,也可以从子去找根啊!然后根加上子的信息 
    59 void solve(){
    60     for(int i=0; i<n; i++){
    61         int mm=find(a[i].id);
    62         ans[mm].id=mm;
    63         ans[mm].ave_num+=a[i].num;
    64         ans[mm].ave_area+=a[i].area;
    65         ans[mm].f=true;
    66     }
    67     int cnt=0;
    68     for(int i=0; i<maxn; i++){
    69         if(visit[i])    ans[find(i)].cnt++;
    70         if(ans[i].f)    cnt++;
    71     }
    72     for(int i=0; i<maxn; i++){
    73         if(ans[i].f){
    74             ans[i].ave_num=ans[i].ave_num/ans[i].cnt;
    75             ans[i].ave_area=ans[i].ave_area/ans[i].cnt;            
    76         }
    77     }
    78     cout<<cnt<<endl;
    79     sort(ans, ans+maxn, cmp);
    80     for(int i=0; i<cnt; i++){
    81         printf("%04d %d %.3f %.3f
    ", ans[i].id, ans[i].cnt, ans[i].ave_num, ans[i].ave_area);
    82     }
    83 }
    84 int main(){
    85     memset(visit, false, sizeof(visit));
    86     input();
    87     solve();
    88     return 0;
    89 }
  • 相关阅读:
    现在这些“创业”的人都是什么心态?
    普及什么是“国家队”,国家队“黑阔”,安全公司“黑客”
    浅谈C++源码的过国内杀软的免杀
    十大谷歌Google搜索技巧分享
    寻找被黑金毁掉的黑客精神
    黑客偷你的密码干什么?
    七个高效的文本编辑习惯(以Vim为例)
    HTTPS是如何保证连接安全,你知道吗?
    分析与提取QQ木马盗号技术
    leetcode304
  • 原文地址:https://www.cnblogs.com/ledoc/p/6610281.html
Copyright © 2020-2023  润新知