题目分析:

1. 首先,题目说一个家庭有孩子爸爸妈妈等几辈人,可以利用并查集将一个家庭里的所有人变成一个集合;

2. 刚好题目的目的也是这样,输出的是一个家庭人数,人均房产面积,人均房产套数等;

3. 然后每个家庭保留最小的id,这步在并查集Union时可以实现;

4. 并查集合并后,每个家庭只有一个id,就是最小的那个id;

5. 然后将新的集合处理一下输出就好了;

链接:https://www.patest.cn/contests/gplt/L2-007

(怎么添加链接??)

(csdn和博客园要是能同步就好了)(逃

AC代码如下:

#include<bits/stdc++.h>
#define test printf("***\n")
#define iis std::ios::sync_with_stdio(false)
using namespace std;
typedef long long LL;
const int N = ;
const int M = ;
const int INF = 0x3f3f3f3f;
const LL mod = ;
const double eps=1e-;
struct lp{
double ans1,ans2;//ans1是房产套数,ans2是房产面积
int id,num;
lp(){ans1=ans2=num=id=;}
friend bool operator <(const lp &A,const lp &B){
if(A.ans2!=B.ans2)return A.ans2>B.ans2;
return A.id<B.id;
}
}a[N],b[N],mul[N];//a是初始,mul是并查集处理后的,b是答案
int vis[N],m[N],fa[N];//m数组记录的是家庭id,和vis一个作用
int n;
void init(){//初始化
for(int i=;i<N;++i)fa[i]=i;
memset(vis,,sizeof(vis));
memset(m,,sizeof(m));
}
int Fi(int x){
return fa[x]==x?x:fa[x]=Fi(fa[x]);
}
void un(int a,int b){//union这里的小细节,是每个家庭只保留最小id
int x=Fi(a),y=Fi(b);
if(x==y)return;
if(x>y)fa[x]=y;
else fa[y]=x;
}
int main(){
scanf("%d",&n);
init();
for(int i=;i<n;++i){
int p1,p2,d,k;
scanf("%d%d%d",&a[i].id,&p1,&p2);
vis[a[i].id]=;
if(p1!=-){
un(p1,a[i].id);
vis[p1]=;
}
if(p2!=-){
un(p2,a[i].id);
vis[p2]=;
}
scanf("%d",&k);
while(k--){
scanf("%d",&d);
if(d!=-){
un(a[i].id,d);
vis[d]=;
}
}
double aa,bb;
scanf("%lf %lf",&aa,&bb);
a[i].ans1=aa;a[i].ans2=bb;
}
for(int i=;i<n;++i){//合并家庭
int id=Fi(a[i].id);
mul[id].id=id;
mul[id].ans1+=a[i].ans1;
mul[id].ans2+=a[i].ans2;
}
for(int i=;i<;++i){
if(vis[i]){
mul[Fi(i)].num++;
}
}
int k=;
for(int i=;i<;++i){
if(vis[i]){
int id=Fi(i);
if(!m[id]){
m[id]=;
double x=mul[id].ans2/mul[id].num;
b[k].ans2=x;
b[k].id=id;
x=mul[id].ans1/mul[id].num;
b[k].num=mul[id].num;
b[k++].ans1=x;
}
}
}
sort(b,b+k);
printf("%d\n",k);//这里要输出家庭总数
for(int i=;i<k;++i){
printf("%04d %d %.3f %.3f\n",b[i].id,b[i].num,b[i].ans1,b[i].ans2);
}
return ;
}

PAT-L2-007-gplt真题的更多相关文章

  1. C#版 - PAT乙级(Basic Level)真题 之 1021.个位数统计 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - P ...

  2. C#版 - PAT乙级(Basic Level)真题 之 1024.科学计数法转化为普通数字 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. PAT Bas ...

  3. 牛客网PAT乙级(Basic Level)真题-组个最小数 (20)

    组个最小数 (20) 时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小) 题目描述 给定数字0-9各若干个.你可以以任意顺序排 ...

  4. 牛客网PAT乙级(Basic Level)真题-数字分类 (20)

    题目描述 给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字: A1 = 能被5整除的数字中所有偶数的和: A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3-n4 ...

  5. 牛客网PAT乙级(Basic Level)真题-数素数 (20)

    题目描述 令Pi表示第i个素数.现任给两个正整数M <= N <= 10000,请输出PM到PN的所有素数. 输入描述: 输入在一行中给出M和N,其间以空格分隔. 输出描述: 输出从PM到 ...

  6. PAT乙级(Basic Level)真题,福尔摩斯的约会

    题目描述 大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”.大侦探很快就明 ...

  7. PAT 甲级真题题解(1-62)

    准备每天刷两题PAT真题.(一句话题解) 1001 A+B Format  模拟输出,注意格式 #include <cstdio> #include <cstring> #in ...

  8. PAT乙级真题及训练题 1025. 反转链表 (25)

    PAT乙级真题及训练题 1025. 反转链表 (25) 感觉几个世纪没打代码了,真是坏习惯,调了两小时把反转链表调出来了,心情舒畅. 这道题的步骤 数据输入,数组纪录下一结点及储存值 创建链表并储存上 ...

  9. 1054. 求平均值 (20)-PAT乙级真题

    今天刚刚到学校,2017年学习正式开始了,今天看到了浙大的<数据结构>这学期又要开课了,决定一定要跟着学习一遍:在大学生mooc网上学习:http://www.icourse163.org ...

  10. 乘风破浪:LeetCode真题_023_Merge k Sorted Lists

    乘风破浪:LeetCode真题_023_Merge k Sorted Lists 一.前言 上次我们学过了合并两个链表,这次我们要合并N个链表要怎么做呢,最先想到的就是转换成2个链表合并的问题,然后解 ...

随机推荐

  1. js将汉字转为相应的拼音

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  2. 整理几个js上传多张图片的效果

    一.普通的上传图片,张数不限制 <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"&g ...

  3. 定义一个Matrix类,实现矩阵的加法和乘法

    #include<iostream> using namespace std; class Matrix { int row;//矩阵的行 int col;//矩阵的列 int **a;/ ...

  4. 决策树学习笔记(Decision Tree)

    什么是决策树? 决策树是一种基本的分类与回归方法.其主要有点事模型具有可得性,分类速度快.学习时,利用训练数据,根据损失函数最小化原则建立决策树模型:预测时,对新数据,利用决策树模型进行分类. 决策树 ...

  5. Android热修复技术选型——三大流派解析

    声明,本文转载自微信公众号文章 2015年以来,Android开发领域里对热修复技术的讨论和分享越来越多,同时也出现了一些不同的解决方案,如QQ空间补丁方案.阿里AndFix以及微信Tinker,它们 ...

  6. ActiveMQ的运用

    MQ的消息队列模式有2种,一种是点对点模式,一种是订阅模式. 点对点模式:点对点的模式主要建立在一个队列上面,当连接一个列队的时候,发送端不需要知道接收端是否正在接收,可以直接向ActiveMQ发送消 ...

  7. Windows2003查看远程桌面连接的用户

    要查看通过远程连接windows2003的用户,则打开任务管理器,切换到“用户”选项卡上进行查看.

  8. VMware vSphere学习整理

    知识点整理 内存选择 一般来说,每个虚拟机需要的内存在1~4GB甚至更多,还要为VMware ESXi预留一部分内存 2个6核的2U服务器配置64GB内存,4个6核或8核心的4U服务器配置128GB或 ...

  9. HiHocoder1419 : 后缀数组四·重复旋律4&[SPOJ]REPEATS:Repeats

    题面 Hihocoder Vjudge Sol 题目的提示说的也非常好 我对求\(LCP(P - L + len \% l, P + len \% L)\)做补充 \(len=LCP(P, P + L ...

  10. [BZOJ3110] [Zjoi2013] K大数查询 (树套树)

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置 ...