题目分析:

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. DM6446 uboot分析

    1. 顶层目录下的Makefile 按照配置顺序: davinci_config :    unconfig @./mkconfig $(@:_config=) arm arm926ejs davin ...

  2. 关闭PHPStorm 2017.1 中的新功能中的参数提示( Parameter hints )

    参数提示( Parameter hints ) 参数提示是显示在方法的参数值前面的文字,帮助你更好的理解语义的具体方法.我们还增加了一个选项来定制你的内联参数提示,以符合你的IDE配色方案. 配置面板 ...

  3. SQL面试题收录

    1.用一条SQL语句 查询出每门课都大于80分的学生姓名 SELECT DISTINCT NAME FROM t_score_tab WHERE NAME NOT IN (SELECT DISTINC ...

  4. net.at.json.JSONException

    1.错误描述 严重:Servlet.service() for servlet [clientServlet] in context with path [/User] threw exception ...

  5. Codeforces Round #432 (Div. 1) B. Arpa and a list of numbers

    qtmd的复习pat,老子不想看了,还不如练几道cf 这题首先可以很容易想到讨论最后的共因子为素数 这个素数太多了,1-1e6之间的素数 复杂度爆炸 所以使用了前缀和,对于每个素数k的每个小区间 (k ...

  6. 关于省市联动的bug

    一,问题描述 1.1,原来的思路 1.1.1,初始化加载省份 $.ajax({ 'type' : 'POST', 'dataType' : 'json', 'url' : '${rc.contextP ...

  7. C#图解教程 第十九章 LINQ

    LINQ 什么是LINQLINQ提供程序 匿名类型 方法语法和查询语法查询变量查询表达式的结构 from子句join子句什么是联结查询主体中的from-let-where片段 from子句let子句w ...

  8. 2014NOIP普及组 子矩阵

    觉得题目水的离开 觉得普及组垃圾的请离开 不知道 DFS 和 DP 的请离开 不屑的大佬请离开 ……. 感谢您贡献的访问量 ————————————————华丽的分割线 ——————————————— ...

  9. 华为悦盒 EC6108V9U 破解过程全记录(root扫盲) [原创]

    电信宽带送的 IPTV 盒子,CPU 为 Hi3798M,1G 内存,8G 存储,支持 H.265 硬解码,系统为 Android 4.4.2,却只能看电视,岂不浪费?好在华为厚道,还是留了后门供 D ...

  10. Delphi子窗体随主窗体大小而变化

    当然办法有很多种,我建议用TRzsplitter更好点, TRzsplitter分割,在其上边放置panel,然后把align置为alClient,则可以随着主窗体的大小而一起变动 选中此控件右键ed ...