L2-007 家庭房产 (25 分) (并查集)
链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805068539215872
题目:
给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数、人均房产面积及房产套数。
输入格式:
输入第一行给出一个正整数N(≤),随后N行,每行按下列格式给出一个人的房产:
编号 父 母 k 孩子1 ... 孩子k 房产套数 总面积
其中编号是每个人独有的一个4位数的编号;父和母分别是该编号对应的这个人的父母的编号(如果已经过世,则显示-1);k(0k≤)是该人的子女的个数;孩子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
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm> using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const int maxn=1e4+;
int n,p1,p2,k,d;
int fa[maxn],vis[maxn]; struct node{
int id;
double ans,sum;
}kk[maxn]; struct he{
int id,num,ans,sum;
double avgans,avgsum;
}final[maxn]; void init(){
for(int i=;i<;i++){
fa[i]=i;
final[i].id=;
final[i].num=;
final[i].ans=;
final[i].sum=;
final[i].avgans=;
final[i].avgsum=;
}
} int cmp(he a,he b){
if(a.avgsum==b.avgsum) return a.id<b.id;
else return a.avgsum>b.avgsum;
} int find(int x){
if(fa[x]==x) return x;
else return fa[x]=find(fa[x]);
} void unite(int x,int y){
x=find(x);
y=find(y);
if(x==y) return;
else fa[y]=x;
} int main(){
init();
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d%d%d",&kk[i].id,&p1,&p2);
vis[kk[i].id]=;
if(p1!=-){
unite(kk[i].id,p1);
vis[p1]=;
}
if(p2!=-){
unite(kk[i].id,p2);
vis[p2]=;
}
scanf("%d",&k);
for(int j=;j<=k;j++){
scanf("%d",&d);
unite(kk[i].id,d);
vis[d]=;
}
scanf("%lf%lf",&kk[i].ans,&kk[i].sum);
}
for(int i=;i<=n;i++){
int tmp=find(kk[i].id);
final[tmp].ans+=kk[i].ans;
final[tmp].sum+=kk[i].sum;
}
for(int i=;i<;i++){
if(vis[i]){
fa[i]=find(i);
if(!final[fa[i]].num)
final[fa[i]].id=i;
final[fa[i]].num++;
final[fa[i]].avgans=final[fa[i]].ans*1.0/final[fa[i]].num;
final[fa[i]].avgsum=final[fa[i]].sum*1.0/final[fa[i]].num;
}
}
int ans=;
sort(final,final+,cmp);
for(int i=;i<;i++){
if(final[i].num) ans++;
else break;
}
printf("%d\n",ans);
for(int i=;i<ans;i++){
printf("%04d %d %.3f %.3f\n",final[i].id,final[i].num,final[i].avgans,final[i].avgsum);
}
return ;
}
0001 15 0.600 100.000
5551 4 0.750 100.000
思路:
重点在于找到每个家庭 用并查集去把一个家庭的都连到一个祖先下面 每次读入父母和孩子都做一遍并查集
麻烦之处在于要处理很多数据 较为繁琐
先把同一个家庭下的父母和孩子都连到一起 然后再循环一遍 更新家庭的总房数和总面积 再一遍循环去求平均 然后输出即可
代码:
L2-007 家庭房产 (25 分) (并查集)的更多相关文章
- L2-007 家庭房产 (25分) 并查集
题目链接 题解:并查集把一个家的并在一起,特殊的一点是编号大的并到小的去.这个题有个坑编号可能为0000,会错数据3和5. 1 #include<bits/stdc++.h> 2 usin ...
- L2-013 红色警报 (25分) 并查集复杂度
代码: 1 /* 2 这道题也是简单并查集,并查集复杂度: 3 空间复杂度为O(N),建立一个集合的时间复杂度为O(1),N次合并M查找的时间复杂度为O(M Alpha(N)), 4 这里Alpha是 ...
- PAT-1021 Deepest Root (25 分) 并查集判断成环和联通+求树的深度
A graph which is connected and acyclic can be considered a tree. The height of the tree depends on t ...
- PAT甲题题解-1114. Family Property (25)-(并查集模板题)
题意:给出每个人的家庭成员信息和自己的房产个数与房产总面积,让你统计出每个家庭的人口数.人均房产个数和人均房产面积.第一行输出家庭个数,随后每行输出家庭成员的最小编号.家庭人口数.人均房产个数.人均房 ...
- PAT-1107 Social Clusters (30 分) 并查集模板
1107 Social Clusters (30 分) When register on a social network, you are always asked to specify your ...
- PAT A 1118. Birds in Forest (25)【并查集】
并查集合并 #include<iostream> using namespace std; const int MAX = 10010; int father[MAX],root[MAX] ...
- PAT甲题题解-1021. Deepest Root (25)-dfs+并查集
dfs求最大层数并查集求连通个数 #include <iostream> #include <cstdio> #include <algorithm> #inclu ...
- PAT题解-1118. Birds in Forest (25)-(并查集模板题)
如题... #include <iostream> #include <cstdio> #include <algorithm> #include <stri ...
- PAT甲题题解-1126. Eulerian Path (25)-欧拉回路+并查集判断图的连通性
题目已经告诉如何判断欧拉回路了,剩下的有一点要注意,可能图本身并不连通. 所以这里用并查集来判断图的联通性. #include <iostream> #include <cstdio ...
- 1021. Deepest Root (25)——DFS+并查集
http://pat.zju.edu.cn/contests/pat-a-practise/1021 无环连通图也可以视为一棵树,选定图中任意一点作为根,如果这时候整个树的深度最大,则称其为 deep ...
随机推荐
- vim命令:编辑模式和命令模式
vim:编辑模式 从一般模式进入编辑模式,只需你按一个键即可(i,I,a,A,o,O,r,R).当进入编辑模式时,会在屏幕的最下一行出现“INSERT或REPLACE”的字样.从编辑模式回到一般模 ...
- Java的selenium代码随笔(8)
Selenium截图方法一: Selenium中截图类TakeScreenshout,这个类主要是获取浏览器窗体内的内容,不包括浏览器的菜单和桌面的任务栏区域,我们用百度首页来截图,看看截图效果. F ...
- Kafka简介及使用PHP处理Kafka消息
Kafka简介及使用PHP处理Kafka消息 Kafka 是一种高吞吐的分布式消息系统,能够替代传统的消息队列用于解耦合数据处理,缓存未处理消息等,同时具有更高的吞吐率,支持分区.多副本.冗余,因此被 ...
- MariaDB多实例的安装配置
初始化数据库: mysql_install_db --basedir=/var/lib/mysql --datadir=/data/3306/data --user=mysql mysql_inst ...
- 015模块——起别名
1.import起别名:通过as关键字可以给模块起别名: 模块名一旦起别名,原模块名就不能再使用 2.起别名的作用:①可以简化模块名字 import mmmmmmmmmmm3 as my_m3 pri ...
- rk3128 手动挂载 U 盘
2019-04-16 关键字: RK . 挂载.U盘 笔者手里有一块非常原生的运行 Android 4.4 操作系统的 RK3128 开发板.原生到各种功能模块都不能用的地步.今天就遇到一个不按常理出 ...
- ZYNQ原理图中添加RTL设计模块
前言 已有的RTL模块怎么添加到原理图中? 流程 (1)添加文件到设计中. (2)右键文件添加到block design中. (3)连线即可. 以上.
- Linux内核模块编程——Hello World模块
Linux内核模块编程 编程环境 Ubuntu 16.04 LTS 什么是模块 内核模块的全称是动态可加载内核模块(Loadable Kernel Modul,KLM),可以动态载入内核,让它成为内核 ...
- openflow packet_out和packet_in分析
任务目的 1. 掌握OpenFlow交换机发送Packet-in消息过程及其消息格式. 2. 掌握OpenFlow控制器发送Packet-out消息过程及其消息格式. 实验原理 Packet-In 使 ...
- manjaro下的.vimrc
我的插件管理是用vim-plug来管理的 下载命令 curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubuserc ...