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[];
}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(家庭房产)的更多相关文章
- L2-007 家庭房产 (25 分)
L2-007 家庭房产 (25 分) 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(≤),随后N行,每行按下 ...
- 团体程序设计天梯赛-练习集L2-007. 家庭房产
L2-007. 家庭房产 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定每个人的家庭成员和其自己名下的房产,请你统计出每个 ...
- L2-007. 家庭房产
L2-007. 家庭房产 题目链接:https://www.patest.cn/contests/gplt/L2-007 并查集 初学,看这题的时候完全没有什么好的想法,参考了@yinzm的blog用 ...
- L2-007. 家庭房产(并查集)*
L2-007. 家庭房产 参考博客 #include <iostream> #include <cstdio> #include <cstring> #includ ...
- 天梯赛 L2-007. (并查集) 家庭房产
题目链接 题目描述 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(<=1000),随后N行,每行按下列格式 ...
- PATL2-007. 家庭房产-并查集
L2-007. 家庭房产 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定每个人的家庭成员和其自己名下的房产,请你统计出每个 ...
- pat 团体天梯赛 L2-007. 家庭房产
L2-007. 家庭房产 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产 ...
- L2-007 家庭房产 (25 分) (并查集)
链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805068539215872 题目: 给定每个人的家庭成员和其自己名 ...
- PAT L2-007 家庭房产
https://pintia.cn/problem-sets/994805046380707840/problems/994805068539215872 给定每个人的家庭成员和其自己名下的房产,请你 ...
随机推荐
- Centos 7 下创建LVM流程
https://www.cnblogs.com/ssslinppp/p/5853312.html
- centos7+hadoop完全分布式集群搭建
Hadoop集群部署,就是以Cluster mode方式进行部署.本文是基于JDK1.7.0_79,hadoop2.7.5. 1.Hadoop的节点构成如下: HDFS daemon: NameN ...
- inno setup 安装前判断进程是否存在,以及停止相应进程<转>
打包的时候遇到了这样的需求:假似用户都是傻瓜 式操作,如果更新安装程序的时候,之前的老程序还在运行这个时候如果你去提示让用户吧老程序手动退掉也不现实. 所以当遇到这种 ...
- Leetcode 题解 Longest Substring Without Repeating Characters_需要重做
最长的没有重复的字符串. 这个题其实不难.但是我第二次做了,硬是把它做出了难的感觉... 变量命名要合理.可读性强.
- linux 2.6.32文件系统的inode
接上文: crash> struct -xo dentry.d_inode ffff8818118002c0 struct dentry { [ffff8818118002d0] struct ...
- LeetCode OJ 93. Restore IP Addresses
题目 Given a string containing only digits, restore it by returning all possible valid IP address comb ...
- 将IP地址字符串转为32位二进制
def str2bin(s): temp = s.split('.') result = '' for i in range(len(temp)): temp[i] = str(bin(int(tem ...
- springboot配置异常 web页面跳转
第一步 controller中 package cn.itcast.springboot.controller; import org.springframework.stereotype.Contr ...
- windows中 git 命令使用记录
建议国内开发安装淘宝npm镜像cnpm npm install -g cnpm --registry=https://registry.npm.taobao.org 或者每次执行安装时 npm ins ...
- winform中datagridview刷新后的排序记忆
datagridview先点标题排序,但是重新刷新之后,还是变成窗体加载后的样子 我这里用定时器刷新的. 1.先定义三个全局变量 /// <summary> /// 需要排序的列和方向 / ...