链接: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 分) (并查集)的更多相关文章

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

    题目链接 题解:并查集把一个家的并在一起,特殊的一点是编号大的并到小的去.这个题有个坑编号可能为0000,会错数据3和5. 1 #include<bits/stdc++.h> 2 usin ...

  2. L2-013 红色警报 (25分) 并查集复杂度

    代码: 1 /* 2 这道题也是简单并查集,并查集复杂度: 3 空间复杂度为O(N),建立一个集合的时间复杂度为O(1),N次合并M查找的时间复杂度为O(M Alpha(N)), 4 这里Alpha是 ...

  3. 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 ...

  4. PAT甲题题解-1114. Family Property (25)-(并查集模板题)

    题意:给出每个人的家庭成员信息和自己的房产个数与房产总面积,让你统计出每个家庭的人口数.人均房产个数和人均房产面积.第一行输出家庭个数,随后每行输出家庭成员的最小编号.家庭人口数.人均房产个数.人均房 ...

  5. PAT-1107 Social Clusters (30 分) 并查集模板

    1107 Social Clusters (30 分) When register on a social network, you are always asked to specify your ...

  6. PAT A 1118. Birds in Forest (25)【并查集】

    并查集合并 #include<iostream> using namespace std; const int MAX = 10010; int father[MAX],root[MAX] ...

  7. PAT甲题题解-1021. Deepest Root (25)-dfs+并查集

    dfs求最大层数并查集求连通个数 #include <iostream> #include <cstdio> #include <algorithm> #inclu ...

  8. PAT题解-1118. Birds in Forest (25)-(并查集模板题)

    如题... #include <iostream> #include <cstdio> #include <algorithm> #include <stri ...

  9. PAT甲题题解-1126. Eulerian Path (25)-欧拉回路+并查集判断图的连通性

    题目已经告诉如何判断欧拉回路了,剩下的有一点要注意,可能图本身并不连通. 所以这里用并查集来判断图的联通性. #include <iostream> #include <cstdio ...

  10. 1021. Deepest Root (25)——DFS+并查集

    http://pat.zju.edu.cn/contests/pat-a-practise/1021 无环连通图也可以视为一棵树,选定图中任意一点作为根,如果这时候整个树的深度最大,则称其为 deep ...

随机推荐

  1. mondb 常用命令学习记录

    mondb 常用命令学习记录 一.MongoDB 下载安装 MongoDB官网 提供了可用于 32 位和 64 位系统的预编译二进制包,你可以从MongoDB官网下载安装,MongoDB 预编译二进制 ...

  2. 微信内分享第三方H5链接无法使用内置浏览器打开的解决方案

    很多朋友在微信内想分享转发H5链接的时候都会很容易碰到H5链接在微信内无法打开或在微信内无法打开app下载页的情况.通常这种情况微信会给个提示 “已停止访问该网址” ,那么导致这个情况的因素有哪些呢, ...

  3. pytorch识别CIFAR10:训练ResNet-34(微调网络,准确率提升到85%)

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 在前一篇中的ResNet-34残差网络,经过训练准确率只达到80%. 这里对网络做点小修改,在最开始的 ...

  4. 数据的存储方式:SQLiteOpenHelper的用法

    Android为了让我们能够更加方便的的管理数据,专门提供了一个SQLiteOpenHelper类,它是一个抽象类,如果我们想要使用它,就需要创建一个自己帮助类去继承它,而且它有两个抽象的方法,分别是 ...

  5. 微信支付之01------获取订单微信支付二维码的接口------Java实现

    [ 前言:以前写过一个获取微信二维码支付的接口,发现最近公司新开的项目会经常用到,现在我又翻出代码看了一遍,觉得还是把整个代码流程记下来的好 ] 借鉴博客: 他这篇博客写得不错,挺全的:https:/ ...

  6. hashChange & url change & QRCode & canvas to image

    hashChange & url change & QRCode & canvas to image "use strict"; /** * * @auth ...

  7. seaborn库

      首先找到Anaconda Prompt命令行,下载seaborn库 ,命令  pip install seaborn 1.风格设置 import seaborn as sns import num ...

  8. 【12】Django 中间件

     前戏 我们在前面的课程中已经学会了给视图函数加装饰器来判断是用户是否登录,把没有登录的用户请求跳转到登录页面.我们通过给几个特定视图函数加装饰器实现了这个需求.但是以后添加的视图函数可能也需要加上装 ...

  9. P1339 [USACO09OCT]热浪Heat Wave

    我太lj了,所以趁着夜色刷了道最短路的水题....然后,,我炸了. 题目描述: The good folks in Texas are having a heatwave this summer. T ...

  10. VimFaultException A specified parameter was not correct configSpec.guestId

    VimFaultException A specified parameter was not correct configSpec.guestId 在对接VMware的环境中创建虚拟机报错 查看错误 ...