题目分析:

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. a链接在新窗口打开

    平时用的收集了几种方法 1.在head标签里添加,base最大的用处就是可以改变某一个网页默认的属性 <base target="_blank"/> 2.Jquery ...

  2. 蜻蜓FM 涉嫌诈骗投资人和广告主源代码剖析

    本文主要内容,引用自知乎的这篇文章:如何评价蜻蜓 FM 伪造用户活跃度等数据 感谢"左莫"."任正"等热心正义的网友--左莫,任正的最早的回答猜测已经被蜻蜓FM ...

  3. 基于am3358的蜂鸣器测试

    #include <sys/ioctl.h> #include<stdio.h> #include <fcntl.h> #include <sys/types ...

  4. BUILD FAILED D:\build.xml:2: 前言中不允许有内容。

    1.错误描述 Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation.保留所有权利. C:\Users\Administ ...

  5. MongoDB的安装和配置(Windows系统)及遇到的常见问题解答

    目前比较流行的数据库大致可以分为三种: 前两种是按照图论理论建立起来的,分别是: 层次式数据库(IMS(Information Management System)是其典型代表)和 网络式数据库(DB ...

  6. sql语句中的left join,right join,inner join的区别

    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录 inner join(等值连接) ...

  7. halcon c++ 异常处理

    现象 Halcon导出的C++程序,try catch不到异常.在Halcon下可以正常Catch到异常.  C++代码:try{   tuple_max(hv_Length, &hv_Max ...

  8. Tmux使用说明

    tmux通过一个终端登录远程主机并运行,其中可开启多个控制台的终端复用.其结构如下:      server 服务器.输入tmux命令时就开启了一个服务器. session 会话.一个服务器可以包含多 ...

  9. Java 8 Date-Time API 详解

    从Java版本1.0开始就支持日期和时间,主要通过java.util.Date类. 但是,Date类设计不佳. 例如,Date中的月份从1开始,但从日期却从0开始.在JDK 1.1中使用它的许多方法已 ...

  10. haproxy的丰富特性简介

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...