pta l2-7(家庭房产)
题目链接: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[6]; }a[1005];struct node{int idm,pp,flag;double num,area; }fam[10005];int root[10005],vis[10005],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;elseroot[xr]=yr; }bool cmp(node xx,node yy){if(xx.area==yy.area)return xx.idm<yy.idm;elsereturn xx.area>yy.area; }int main(){scanf("%d",&n);for(int i=0;i<10000;++i)root[i]=i;for(int i=0;i<n;++i){scanf("%d%d%d%d",&a[i].id,&a[i].fa,&a[i].ma,&a[i].k);for(int j=0;j<a[i].k;++j)scanf("%d",&a[i].ch[j]);scanf("%d%d",&a[i].num,&a[i].area);vis[a[i].id]=1;if(a[i].fa!=-1)vis[a[i].fa]=1,Union(a[i].id,a[i].fa);if(a[i].ma!=-1)vis[a[i].ma]=1,Union(a[i].id,a[i].ma);for(int j=0;j<a[i].k;++j)vis[a[i].ch[j]]=1,Union(a[i].id,a[i].ch[j]);} for(int i=0;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=1;}for(int i=0;i<10000;++i){if(vis[i]) ++fam[getr(i)].pp;if(fam[i].flag) ++res;}for(int i=0;i<10000;++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+10000,cmp);printf("%d\n",res);for(int i=0;i<res;++i)printf("%04d %d %.3f %.3f\n",fam[i].idm,fam[i].pp,fam[i].num,fam[i].area);return 0; }
转载于:https://www.cnblogs.com/FrankChen831X/p/10543298.html
pta l2-7(家庭房产)相关推荐
- CCCC L2 007 家庭房产 并查集
最开始看到这个题,想不到只用并查集,在某一个如果同时又两个其他家庭包括的人怎么办,所有开了一个home类,想通过Home之间的合并解决这个问题,最后由于内容过于庞大而超时. 参考网上的思路用并查集可以 ...
- PTA 家庭房产 (图论,暴搜)
PTA 家庭房产 (图论,暴搜) 题目详情: 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(≤1000),随后N ...
- C++学习之路 | PTA(天梯赛)—— L2-007 家庭房产 (25分)(带注释)(并查集)(精简)
L2-007 家庭房产 (25分) 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(≤1000),随后N行,每行按 ...
- 7-56 家庭房产 (25 分)
7-56 家庭房产 (25 分) 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(≤1000),随后N行,每行按下 ...
- L2-007. 家庭房产
L2-007. 家庭房产 题目链接:https://www.patest.cn/contests/gplt/L2-007 并查集 初学,看这题的时候完全没有什么好的想法,参考了@yinzm的blog用 ...
- 【CCCC】L2-007 家庭房产 (25分),并查集,结构统计
problem L2-007 家庭房产 (25分) 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(≤1000), ...
- 7-11 家庭房产(25 分) 【并查集】
7-11 家庭房产(25 分) 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(≤1000),随后N行,每行按下列 ...
- L2-007. 家庭房产-PAT团体程序设计天梯赛GPLT
给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(<=1000),随后N行,每行按下列格式给出一个人的房产: ...
- 数据结构与算法A实验六图论---7-6 家庭房产(并查集)
给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(≤1000),随后N行,每行按下列格式给出一个人的房产: 编号 父 ...
最新文章
- ttc转换ttf字体在线_R 语言画图中英文字体解决方案
- kettle安装部署及远程执行
- SAP错误问题汇总(转)
- 1564: Strange Class
- Android(IPC)进程间通讯1:详解Binder由来?
- android内容协调,理清Android协调布局CoordinatorLayout的摆放位置及特殊属性。
- 【Interfacenavigation】按钮(29)
- javaee怎么做到只有登录才可以进网页_java初学者,应该怎么去学习?(建议收藏)...
- 年龄是计数还是计量_MSA你只知道计量型和计数型?有哪些类型?分别是什么方法?...
- 如何创建_重庆市百科如何创建
- python中的作用域_python中作用域
- 如何利用UltraISO将系统镜像刻录到U盘上
- 从零开始构建 RPM 包
- CSS3 排版属性盒子模型 第二个模块
- 数列求和 (Java实现)
- 学生宿舍管理数据库设计(下)
- 阿里云 Aliplayer高级功能介绍(七):多分辨率
- Word控件Spire.Doc 【段落处理】教程(十五):在 C# 中为 Word 段落添加制表位
- 解决maven pom依赖的jar无法从私服下载问题【复制大法】
- 左右手坐标系与旋转正向
热门文章
- Oracle 好书 02 ( 安装oracle 10g软件及创建数据库 )
- Windows Phone 7 IEnumerableT.Select和SelectMany的区别
- TP、TN、FP、FN
- Spark配置参数优先级
- Windows下本机简易监控系统搭建(Telegraf+Influxdb+Grafana)
- 利用SparkSQL(java版)将离线数据或实时流数据写入hive的用法及坑点
- java异常处理的throw和throws的区别
- 《LeetCode力扣练习》第55题 跳跃游戏 Java
- 《LeetCode力扣练习》第6题 C语言版 (做出来就行,别问我效率。。。。)
- idea里maven设置本地仓库报错原因