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 ...
随机推荐
- ABP之Caching
简介 ABP提供缓存抽象,默认使用MemoryCache.但是可以替换成其他缓存程序,比如 Abp.RedisCache 是使用Redis实现缓存. ICacheManager 缓存的主要接口是ICa ...
- 类StringBuilder
StringBuilder概述 因为字符串的底层是一个被final修饰的数组,不能改变,是一个常量.所以每当进行字符串拼接时,总是会在内存中创建一个新的对象.由此可知,如果对字符串进行拼接操作,每次拼 ...
- keepalived的主从备份服务器
一.环境说明 1.操作系统内核版本:linux 6.0 2.Keepalived软件版本:keepalived-1.1.20.tar.gz 二.环境配置 1.主Keepalived服务器IP地址 19 ...
- "=="和 equals 方法究竟有什么区别?
"=="和 equals 方法究竟有什么区别? ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同, 要比较两个基本类型的数据或两个引 ...
- 通俗理解ZooKeeper是如何保证数据一致性的
https://blog.csdn.net/liuhaiabc/article/details/70771322 https://blog.csdn.net/zhaoyangjian724/artic ...
- setInterval的简单理解和实验
setInterval的用法 setInterval(fn_name,time_num); setInterval(fn_name,time_num,这里是函数参数); 意思是,现在不执行fn_nam ...
- OpenCV4.1.0实践(3) - 图片缩放
简单的案例: (1)通过比例进行缩放 import cv2 as cv import numpy as np # 图片缩放 img = cv.imread('images/animal.jpg', f ...
- celery 和 haystack
celery 是分布式异步框架 haystack 是全文检索 只能在Django中用. 一.什么是celery? ---->它是Python写的,所以只支持Python使用.但是消 ...
- java订单金额分级计算
package ord; import java.util.ArrayList; public class order { public String orderid; public user use ...
- Element类型和HTML元素获取
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...