L2-007. 家庭房产

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越

给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数、人均房产面积及房产套数。

输入格式:

输入第一行给出一个正整数N(<=1000),随后N行,每行按下列格式给出一个人的房产:

编号 父 母 k 孩子1 ... 孩子k 房产套数 总面积

其中 编号 是每个人独有的一个4位数的编号; 和  分别是该编号对应的这个人的父母的编号(如果已经过世,则显示-1);k(0<=k<=5)是该人的子女的个数;孩子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
0001 15 0.600 100.000
5551 4 0.750 100.000

提交代码

题解: 
这道题的题目很繁琐,其实意思就是让你把一家一家又一家的人合并成大家族,之后统计整个家族的房产信息。 
至于怎么做?当然是用并查集呀。这道题需要的信息比较多,第一次使用并查集是合并输入id的父母及子女信息,顺便算算人数,第二次是计算一个大家族的房产总数,统计家庭总人数,第三次进行运算,完善调整排序后得到最终答案。

#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
#include<map>
#define inf 0x3f3f3f3f
using namespace std;
map<int,int>mp;
int pra[];
int v[];
struct node
{
int num;
double sum;
int mi;
int num2;
}a[]; struct node1//我的方法有点麻烦的,把最后的结果存在b里
{
int num;
double sum;
int mi;
int num2;
}b[];
int find(int x)
{
if(x==pra[x]) return x;
return pra[x]=find(pra[x]);
}
void unite(int x,int y)
{
x=find(x);
y=find(y);
if(x==y) return;
pra[y]=x;
}
bool cmp(node1 x,node1 y)
{
if(x.sum==y.sum)
{
return x.mi<y.mi;
}
else return x.sum/y.sum>1.0;
} int main()
{
for(int i=;i<=;i++)//居然也有数字0000,没考虑到得了17分
{
pra[i]=i;
a[i].num=;
a[i].sum=;
a[i].num2=;
a[i].mi=i;
v[i]=;
b[i].num=;
b[i].sum=;
b[i].num2=;
b[i].mi=inf;
}
int n;
cin>>n;
for(int i=;i<=n;i++)
{
int x,f,m;
cin>>x>>f>>m;
if(!v[x])
{
v[x]=;//出现过的,人数我就不加了,以免重复
a[x].num++;
}
if(f!=-)
{
unite(x,f);
if(!v[f])
{
v[f]=;
a[x].num++;
}
}
if(m!=-)
{
unite(x,m);
if(!v[m])
{
v[m]=;
a[x].num++;
}
}
int k;
cin>>k;
for(int j=;j<=k;j++)
{
int y;
cin>>y;
if(!v[y])
{
v[y]=;
a[x].num++;
}
unite(y,x);
}
double ss;
int kk;
cin>>kk>>ss;
a[x].num2+=kk; //还要算房产数
a[x].sum+=ss;
}
int k=;
for(int i=;i<=;i++)
{
if(v[i])
{
int x=find(i);
if(!mp[x])
{
mp[x]=k++;
}
if(x==i)
{
b[mp[x]].num+=a[x].num;
b[mp[x]].num2+=a[x].num2;
b[mp[x]].sum+=a[x].sum;
b[mp[x]].mi=min(a[x].mi,b[mp[x]].mi);
}
else
{
b[mp[x]].num+=a[i].num;
b[mp[x]].num2+=a[i].num2;
b[mp[x]].sum+=a[i].sum;
b[mp[x]].mi=min(b[mp[x]].mi,a[i].mi);
} }
}
cout<<k-<<endl;
for(int i=;i<=k-;i++)
{
b[i].sum=b[i].sum*1.0/b[i].num;
}
sort(b+,b+k,cmp);
for(int i=;i<=k-;i++)
{
printf("%04d",b[i].mi);//04还真方便呢
cout<<" "<<b[i].num<<" ";
printf("%.3lf %.3lf",b[i].num2*1.0/b[i].num,b[i].sum);
if(i!=k-) cout<<endl;
}
}

PATL2-007. 家庭房产-并查集的更多相关文章

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

    #include <cstdio> #include <set> #include <vector> #include <algorithm> usin ...

  2. TOJ3660家庭关系(并查集+hash+图的连通性)

    家庭关系   时间限制(普通/Java):1000MS/3000MS     运行内存限制:65536KByte 总提交: 38            测试通过: 9 描述 给定若干家庭成员之间的关系 ...

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

    链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805068539215872 题目: 给定每个人的家庭成员和其自己名 ...

  4. 天梯赛 L2-007. (并查集) 家庭房产

    题目链接 题目描述 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(<=1000),随后N行,每行按下列格式 ...

  5. GPLT L2-007 家庭房产 (并查集)

    题意: 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 思路: 输入和输出各构造一个结构体,利用并查集归并输入,枚举编号进行输出. #include &l ...

  6. L2-007. 家庭房产(并查集)*

    L2-007. 家庭房产 参考博客 #include <iostream> #include <cstdio> #include <cstring> #includ ...

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

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

  8. 团体程序设计天梯赛-练习集L2-007. 家庭房产

    L2-007. 家庭房产 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定每个人的家庭成员和其自己名下的房产,请你统计出每个 ...

  9. 【PAT-并查集-水题】L2-007-家庭房产

    L2-007. 家庭房产 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(<=1000),随后N行,每行按下 ...

随机推荐

  1. create_workqueue和create_singlethread_workqueue【转】

    本文转载自:http://bgutech.blog.163.com/blog/static/18261124320116181119889/ 1. 什么是workqueueLinux中的Workque ...

  2. tomcat 正常启动但不能访问

    Eclipse中的Tomcat可以正常启动,不过发布项目之后,无法访问,包括http://localhost:8080/的小猫页面也无法访问到,报404错误.这是因为Eclipse所指定的Server ...

  3. Nginx错误日志配置信息详解

    Nginx的错误日志可以配置在Main区块,也可以配置在虚拟主机区块中.Nginx软件会把自身运行的故障信息及用户访问的日志信息记录到指定的日志文件里,是我们调试Nginx服务的重要参考. error ...

  4. PHP开发框架

    利用PHP开发框架可以帮助你编写干净和可重用的代码.PHP开发框架遵循MVC设计模式,以确保能够明确区分逻辑和演示文稿.但是有关PHP框架的争论也不少,这是因为有的人喜欢性能,有的人喜欢文档,而有的人 ...

  5. 进程【TLCL】

    ps命令 ps x 加上 "x" 选项(注意没有开头的 "-" 字符),告诉 ps 命令,展示所有进程,不管它们由什么 终端(如果有的话)控制. 在 TTY 一 ...

  6. 导出android真机上应用的apk文件

    1. 首先你的手机要开启调试模式 2. 终端输入命令行 (这个时候需要在手机端打开此应用.它的思路是抓取出当前窗口的包名.以下命令操作自己未亲自验证.) adb shell dumpsys windo ...

  7. Elasticsearch Suggester 学习

    suggester搜索就像百度搜索框中的提示类似. Elasticsearch 中提供类似的搜索功能. 答案就在Suggesters API. Suggesters基本的运作原理是将输入的文本分解为t ...

  8. js享元模式

    享元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象. 内部状态与外部状态 内部状态存储于对象内部. 内部状态可以被一些对象共享 内部状态独立于具体的场景,通常不会改变 外部状态取决 ...

  9. js外观模式

    外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式类图: 然而对于外观模式而言,是没有一个一般化的类图描述,下面演示一个外观模式的 ...

  10. Spinner使用一

    Spinner使用一 一.使用方法 1.在layout中创建Spinner控件 <Spinner android:id="@+id/spinner1" android:lay ...