题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805068539215872

题意:给定n个人的信息,包括其编号,父母以及孩子的编号,以及其名下的房产数量和房产面积,要求有多少个家族,并列出每个家族的最小编号,家庭人数,家庭人均房产数量和人均房产面积。

思路:算法部分就是简单的并查集,但数据处理等方面还挺复杂,一定要仔细。首先用个data结构体数组来存储输入的每个人的信息,用node结构体来存储每个家族的信息,其中包括该家族最小成员编号,人数,人均房产数量和人均房产面积,其中flag涌来标识是否存在,因为数据量不大,可以暴力处理,就是要注意编码细节。输入人的信息时,将他和其父母孩子合并,并使祖先的编号最小,用vis数组标记该编号是否出现。合并之后遍历n个人,将其1房产信息都加入到家族结构体中,最后还要排序,先按人均房产面积降序排列,再按编号升序排列。

AC代码:

#include<bits/stdc++.h>
using namespace std; struct data{
int id,fa,ma,k,num,area;
int ch[];
}a[]; struct node{
int idm,pp,flag;
double num,area;
}fam[]; int root[],vis[],n,res; int getr(int k){
if(root[k]==k) return k;
else return root[k]=getr(root[k]);
} void Union(int x,int y){
int xr=getr(x),yr=getr(y);
if(xr<yr)
root[yr]=xr;
else
root[xr]=yr;
} bool cmp(node xx,node yy){
if(xx.area==yy.area)
return xx.idm<yy.idm;
else
return xx.area>yy.area;
} int main(){
scanf("%d",&n);
for(int i=;i<;++i)
root[i]=i;
for(int i=;i<n;++i){
scanf("%d%d%d%d",&a[i].id,&a[i].fa,&a[i].ma,&a[i].k);
for(int j=;j<a[i].k;++j)
scanf("%d",&a[i].ch[j]);
scanf("%d%d",&a[i].num,&a[i].area);
vis[a[i].id]=;
if(a[i].fa!=-)
vis[a[i].fa]=,Union(a[i].id,a[i].fa);
if(a[i].ma!=-)
vis[a[i].ma]=,Union(a[i].id,a[i].ma);
for(int j=;j<a[i].k;++j)
vis[a[i].ch[j]]=,Union(a[i].id,a[i].ch[j]);
}
for(int i=;i<n;++i){
int idr=getr(a[i].id);
fam[idr].idm=idr;
fam[idr].num+=a[i].num;
fam[idr].area+=a[i].area;
fam[idr].flag=;
}
for(int i=;i<;++i){
if(vis[i]) ++fam[getr(i)].pp;
if(fam[i].flag) ++res;
}
for(int i=;i<;++i)
if(fam[i].flag){
fam[i].num=fam[i].num*1.0/(fam[i].pp*1.0);
fam[i].area=fam[i].area*1.0/(fam[i].pp*1.0);
}
sort(fam,fam+,cmp);
printf("%d\n",res);
for(int i=;i<res;++i)
printf("%04d %d %.3f %.3f\n",fam[i].idm,fam[i].pp,fam[i].num,fam[i].area);
return ;
}

pta l2-7(家庭房产)的更多相关文章

  1. L2-007 家庭房产 (25 分)

    L2-007 家庭房产 (25 分)   给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(≤),随后N行,每行按下 ...

  2. 团体程序设计天梯赛-练习集L2-007. 家庭房产

    L2-007. 家庭房产 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定每个人的家庭成员和其自己名下的房产,请你统计出每个 ...

  3. L2-007. 家庭房产

    L2-007. 家庭房产 题目链接:https://www.patest.cn/contests/gplt/L2-007 并查集 初学,看这题的时候完全没有什么好的想法,参考了@yinzm的blog用 ...

  4. L2-007. 家庭房产(并查集)*

    L2-007. 家庭房产 参考博客 #include <iostream> #include <cstdio> #include <cstring> #includ ...

  5. 天梯赛 L2-007. (并查集) 家庭房产

    题目链接 题目描述 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(<=1000),随后N行,每行按下列格式 ...

  6. PATL2-007. 家庭房产-并查集

    L2-007. 家庭房产 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定每个人的家庭成员和其自己名下的房产,请你统计出每个 ...

  7. pat 团体天梯赛 L2-007. 家庭房产

    L2-007. 家庭房产 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产 ...

  8. L2-007 家庭房产 (25 分) (并查集)

    链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805068539215872 题目: 给定每个人的家庭成员和其自己名 ...

  9. PAT L2-007 家庭房产

    https://pintia.cn/problem-sets/994805046380707840/problems/994805068539215872 给定每个人的家庭成员和其自己名下的房产,请你 ...

随机推荐

  1. hasattr getattr setattr delattr --> (反射)

    class Room: def __init__(self,name): self.name = name def big_room(self): print('bigroot') R = Room( ...

  2. Collection List接口

    常用的:ArrayList,Vector 特点:有序的,允许多个空值

  3. call 和 apply

    call和apply作用一样,都是为了转移this,区别在于传入参数的方式不同. this指当前方法所在的对象,如果方法的外面没有对象,则默认是window.由于闭包虽在调用的方法中,但是在创建的时候 ...

  4. LeetCode题解:Flatten Binary Tree to Linked List:别人的递归!

    总是在看完别人的代码之后,才发现自己的差距! 我的递归: 先把左侧扁平化,再把右侧扁平化. 然后找到左侧最后一个节点,把右侧移动过去. 然后把左侧整体移到右侧,左侧置为空. 很复杂吧! 如果节点很长的 ...

  5. Leetcode 题解 Trapping Rain Water

    题目链接:https://leetcode.com/problems/trapping-rain-water/description/ 思路: 1.先找到最左侧第一个高度不为0的柱子i. 2.从i+1 ...

  6. php装curl拓展出错

    错误: checking for cURL in default path... not found checking for cURL 7.10.5 or greater... ./configur ...

  7. CSRF学习小结

    什么是CSRF CSRF,全称是Cross Site Request Forgery,也即跨站请求伪造.对于CSRF来说,它的请求有两个关键点:跨站点的请求和请求是伪造的. 跨站点的请求的来源是其他站 ...

  8. Oracle VM VirtualBox各种显示模式切换 热键

    初用VirtualBox, 几个显示切换快捷键还是要记一下的: Right Ctrl + F        -- 切换到全屏模式 Right Ctrl + L        -- 切换到无缝模式 Ri ...

  9. php运行代码流程和性能优化方法

    ---恢复内容开始--- php文件->扫描->zd引擎去理解->opcodes->执行->输出 例子,用white随机循环20000数据进行性能测试,分别对比isset ...

  10. python 装饰器的缺点以及解决方法

    1.python装饰器的缺点 装饰器可以允许我们在不改变函数或犯方法的调用方式的情况下,添加额外的功能; 如下所示,我们要在中的方法之前增加装饰器check_is_admin,用来判断执行类的方法的用 ...