L2-007 家庭房产 (25 分)
给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数、人均房产面积及房产套数。
输入格式:
输入第一行给出一个正整数N(≤),随后N行,每行按下列格式给出一个人的房产:
编号 父 母 k 孩子1 ... 孩子k 房产套数 总面积
其中编号是每个人独有的一个4位数的编号;父和母分别是该编号对应的这个人的父母的编号(如果已经过世,则显示-1);k(0k≤)是该人的子女的个数;孩子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
并查集经典题 要稍微改写一下unite函数
PTA经典特色题目 算法不难 倒腾起来麻烦 还给要整个排序 还考察了STL的用法(= =)
推荐做
unite要改写一下 id最小的作为根节点
#include <stdio.h>
#include <iostream>
#include <map>
#include <set>
#include <algorithm>
using namespace std;
int N, M, K;
const int si = ;
int par[si];
int cnt[si];
double area[si];
int housenum[si];
bool vis[si];
struct node {
int id, num;
double avgnum, avgarea; }no[si]; bool cmp (node a, node b) {
if (a.avgarea != b.avgarea) return a.avgarea > b.avgarea;
return a.id < b.id;
}
using namespace std; int find(int x) {
if (x == par[x]) return par[x];
return par[x] = find(par[x]);
}
bool same(int x, int y) {
return find(x) == find(y);
}
void unite(int x, int y) {
x = find(x);
y = find(y);
if (x == y) return;
if (x < y) {
par[y] = par[x];
}
else {
par[x] = par[y];
}
}
int main() {
cin >> N;
for (int i = ; i < si; i++) par[i] = i; int f, m, id, k, tp;
for (int i = ; i < N; i++) {
cin >> id >> f >> m >> k;
if (f != -) {
unite(id, f);
vis[f] = ;
}
if (m != -) {
unite(id, m);
vis[m] = ;
}
vis[id] = ;
for (int j = ; j < k; j++) {
scanf("%d", &tp);
unite(id, tp);
vis[tp] = ;
}
cin >> housenum[id] >> area[id];
}
set<int> st;
for (int i = ; i < si; i++) {
if (!vis[i]) continue;
int x = find(i);//这个家庭
cnt[x]++;//人口数++
if (x != i) {
area[x] += area[i];
housenum[x] += housenum[i];
}
st.insert(x);
}
set<int>:: iterator it = st.begin();
int count = ;
while (it != st.end()) {
int x = *it;
no[count].id = x;
no[count].num = cnt[x];
no[count].avgnum = housenum[x] * 1.0 / cnt[x];
no[count++].avgarea = area[x] * 1.0 / cnt[x];
it++;
}
cout << count << endl;
sort (no, no + count, cmp);
for (int i = ; i < count; i++) {
printf("%04d %d %.3f %.3f\n", no[i].id, no[i].num, no[i].avgnum, no[i].avgarea);
}
return ;
}
L2-007 家庭房产 (25 分)的更多相关文章
- L2-007 家庭房产 (25分) 并查集
题目链接 题解:并查集把一个家的并在一起,特殊的一点是编号大的并到小的去.这个题有个坑编号可能为0000,会错数据3和5. 1 #include<bits/stdc++.h> 2 usin ...
- PAT L2-007 家庭房产
https://pintia.cn/problem-sets/994805046380707840/problems/994805068539215872 给定每个人的家庭成员和其自己名下的房产,请你 ...
- 【刷题-PAT】A1114 Family Property (25 分)
1114 Family Property (25 分) This time, you are supposed to help us collect the data for family-owned ...
- 团体程序设计天梯赛-练习集L2-007. 家庭房产
L2-007. 家庭房产 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定每个人的家庭成员和其自己名下的房产,请你统计出每个 ...
- L2-006 树的遍历 (25 分) (根据后序遍历与中序遍历建二叉树)
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805069361299456 L2-006 树的遍历 (25 分 ...
- 1114 Family Property (25 分)
1114 Family Property (25 分) This time, you are supposed to help us collect the data for family-owned ...
- 天梯赛 L2-007. (并查集) 家庭房产
题目链接 题目描述 给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产套数. 输入格式: 输入第一行给出一个正整数N(<=1000),随后N行,每行按下列格式 ...
- PATL2-007. 家庭房产-并查集
L2-007. 家庭房产 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定每个人的家庭成员和其自己名下的房产,请你统计出每个 ...
- pat 团体天梯赛 L2-007. 家庭房产
L2-007. 家庭房产 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序给定每个人的家庭成员和其自己名下的房产,请你统计出每个家庭的人口数.人均房产面积及房产 ...
随机推荐
- nodejs window平台上 以服务运行
刚学nodejs 想使用 sc create 来创建服务,但是倒腾了很久没有弄出来,创建是成功了,使用 net start 启动服务报错,没有控制功能.后来网上找了一下 发现这个东西:nssm 使用 ...
- Linux 安装 Rabbit MQ
安装socat yum -y install socat 下载erlang软件包,本文使用erlang-19.0.4版本,下面给出下载链接 wget http://www.rabbitmq.com/r ...
- linux命令-diff对比文件工具
diff 命令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方.diff在命令行中打印每一个行的改动.最新版本的diff还支持二进制文件.diff程序的 ...
- Photos_2017 China MVP Community Connection
- VS2017提醒找不到MSVCR110D.dll
我的电脑时win10我已解决,不能传文件,需要联系我
- js实现按钮开关.单机下拉菜单
通过onclick单击事件,实现效果,代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf- ...
- 帝国cms中当调用当前信息不足时,继续取其他数据
<?php$sql=$empire->query("select * from table1 order by id limit 20"); $num = mysql_ ...
- easyui combobox模糊搜索
combobox实现模糊搜索功能 <input class="easyui-combobox" id="hybq_PADD" name="hyb ...
- 活代码LINQ——09
一.代码 ' Fig. 9.7: LINQWithListCollection.vb ' LINQ to Objects using a List(Of String). Module LINQWit ...
- 结对编程ending-我和洧洧的碎碎念
应该是第一次和队友分工合作去完成一个项目,其中也经历了跳进不少坑又被拉回来的过程,总体来说这对于我俩也的确是值得纪念的一次经历. 我的碎碎念时间…… 对比个人项目和结对编程项目二者需求,前者重在面对不 ...