博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
L2-007 家庭房产 (25 分) (并查集)
阅读量:5306 次
发布时间:2019-06-14

本文共 2502 字,大约阅读时间需要 8 分钟。

链接:

 


 

 

题目:

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

输入格式:

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

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

其中编号是每个人独有的一个4位数的编号;分别是该编号对应的这个人的父母的编号(如果已经过世,则显示-1);k0k≤)是该人的子女的个数;孩子i是其子女的编号。

输出格式:

首先在第一行输出家庭个数(所有有亲属关系的人都属于同一个家庭)。随后按下列格式输出每个家庭的信息:

家庭成员的最小编号 家庭人口数 人均房产套数 人均房产面积

其中人均值要求保留小数点后3位。家庭信息首先按人均面积降序输出,若有并列,则按成员编号的升序输出。

输入样例:

106666 5551 5552 1 7777 1 1001234 5678 9012 1 0002 2 3008888 -1 -1 0 1 10002468 0001 0004 1 2222 1 5007777 6666 -1 0 2 3003721 -1 -1 1 2333 2 1509012 -1 -1 3 1236 1235 1234 1 1001235 5678 9012 0 1 502222 1236 2468 2 6661 6662 1 3002333 -1 3721 3 6661 6662 6663 1 100

输出样例:

38888 1 1.000 1000.000
#include 
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int maxn=1e4+10;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=0;i<10000;i++){ fa[i]=i; final[i].id=0; final[i].num=0; final[i].ans=0; final[i].sum=0; final[i].avgans=0; final[i].avgsum=0; }}int cmp(he a,he b){ if(a.avgsum==b.avgsum) return a.id
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=1;i<=n;i++){ scanf("%d%d%d",&kk[i].id,&p1,&p2); vis[kk[i].id]=1; if(p1!=-1){ unite(kk[i].id,p1); vis[p1]=1; } if(p2!=-1){ unite(kk[i].id,p2); vis[p2]=1; } scanf("%d",&k); for(int j=1;j<=k;j++){ scanf("%d",&d); unite(kk[i].id,d); vis[d]=1; } scanf("%lf%lf",&kk[i].ans,&kk[i].sum); } for(int i=1;i<=n;i++){ int tmp=find(kk[i].id); final[tmp].ans+=kk[i].ans; final[tmp].sum+=kk[i].sum; } for(int i=0;i<10000;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=0; sort(final,final+10000,cmp); for(int i=0;i<10000;i++){ if(final[i].num) ans++; else break; } printf("%d\n",ans); for(int i=0;i

 

0001 15 0.600 100.0005551 4 0.750 100.000

思路: 重点在于找到每个家庭 用并查集去把一个家庭的都连到一个祖先下面 每次读入父母和孩子都做一遍并查集 麻烦之处在于要处理很多数据 较为繁琐 先把同一个家庭下的父母和孩子都连到一起 然后再循环一遍 更新家庭的总房数和总面积 再一遍循环去求平均 然后输出即可

代码:

转载于:https://www.cnblogs.com/whdsunny/p/10615529.html

你可能感兴趣的文章
DFS-hdu-2821-Pusher
查看>>
MyEclipse中将普通Java项目convert(转化)为Maven项目
查看>>
node js 安装.node-gyp/8.9.4 权限 无法访问
查看>>
windows基本命令
查看>>
VMware中CentOS设置静态IP
查看>>
[poj1006]Biorhythms
查看>>
jsp
查看>>
Hyper-V虚拟机上安装一个图形界面的Linux系统
查看>>
Hover功能
查看>>
js千分位处理
查看>>
Mac---------三指拖移
查看>>
关于VMare中安装Ubuntu的一些说明
查看>>
字符串类型的相互转换
查看>>
day57 手写socket、路由系统、响应一个动态内容、链接数据库、django配置、及应用、DNS服务器...
查看>>
HTTP状态码
查看>>
iOS如何过滤掉文本中特殊字符
查看>>
python - wmi模块学习(windwos硬件信息获取)
查看>>
Maven------使用maven新建web项目出现问题 项目名称出现红色交叉
查看>>
基础学习:C#中float的取值范围和精度
查看>>
Akka-Cluster(3)- ClusterClient, 集群客户端
查看>>