【GPLT 二阶题目集】L2-007 家庭房产

news2024/11/15 1:38:28

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

输入格式:

输入第一行给出一个正整数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

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;

map<int, int> anc; //编号->祖先
map< int, pair<int, int> > infor; //编号->房产套数,总面积

class Family
{
public:
    int num; //家庭成员最小编号
    int count; //家庭人口数
    double house; //人均房产套数
    double size; //人均房产面积
    int zuxian; //(最高)祖先
    void init(int n)
    {
        num = n;
        count = 1;
        house = infor[n].first;
        size = infor[n].second;
        zuxian = anc[n];
        return;
    }
};

int findd(int n) //查找n的(最高)祖先
{
    if (anc[n] == n)
        return n;
    anc[n] = findd(anc[n]);
    return anc[n];
}

void unionn(int a, int b) //合并a与b(建立共同祖先)
{
    if (a == -1 || b == -1)
        return;
    int a_anc = findd(a);
    int b_anc = findd(b);
    anc[a_anc] = b_anc;
    return;
}

bool cmp(pair<int, int> a, pair<int, int> b)
{
    if (a.second == b.second)
        return a.first < b.first;
    return a.second < b.second;
}

bool cmp2(Family a, Family b)
{
    if (a.size != b.size)
        return a.size > b.size;
    return a.num < b.num;
}

int main()
{
    int n; cin >> n;
    for (int i = 0; i < n; i++) {
        int pe, fa, mo; cin >> pe >> fa >> mo;
        anc.insert(make_pair(pe, pe));
        if (fa != -1)
            anc.insert(make_pair(fa, fa));
        if (mo != -1)
            anc.insert(make_pair(mo, mo));
        //建立pe与fa、mo的联系
        unionn(pe, fa); unionn(pe, mo);
        int k; cin >> k;
        for (int j = 0; j < k; j++) {
            int chi; cin >> chi;
            anc.insert(make_pair(chi, chi));
            //建立pe与各个chi的联系
            unionn(pe, chi);
        }
        int a, b; cin >> a >> b;
        infor.insert(make_pair(pe, make_pair(a, b)));
    }

    for (map<int, int>::iterator it = anc.begin(); it != anc.end(); it++)
        findd((*it).first); //更新所有人的祖先编号
    vector< pair<int, int> > ancestor;
    ancestor.assign(anc.begin(), anc.end()); //拷贝祖先数据,准备排序:祖先升序->编号升序
    sort(ancestor.begin(), ancestor.end(), cmp);
    vector<Family> res;

    Family family; family.init(ancestor[0].first); //创建家庭,并统计数据
    for (int i = 1; i < ancestor.size(); i++) {
        if (ancestor[i].second == family.zuxian) { //同一家庭,数据叠加
            family.count++;
            family.house += infor[ancestor[i].first].first;
            family.size += infor[ancestor[i].first].second;
        }
        else { //新家庭,结算上一家庭数据
            family.house /= family.count;
            family.size /= family.count;
            res.push_back(family);
            family.init(ancestor[i].first);
        }
        //最后一次直接结算
        if (i == ancestor.size() - 1) {
            family.house /= family.count;
            family.size /= family.count;
            res.push_back(family);
            family.init(ancestor[i].first);
        }
    }

    cout << res.size() << endl;
    sort(res.begin(), res.end(), cmp2); //排序:人均面积降序->编号升序
    for (int i = 0; i < res.size(); i++) {
        printf("%04d %d %.3f %.3f\n", res[i].num, res[i].count, res[i].house, res[i].size);
    }
    return 0;
}

 注意事项:

题目给的数据比较多,使用并查集寻找共同祖先。

如有问题,欢迎提出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/196772.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java创建线程的七种方法,全网最全面总结~

目录 前言 一、继承Thread&#xff0c;重写run方法 二、实现Runnable接口&#xff0c;重写run方法 三、使用匿名内部类创建 Thread 子类对象 四、使用匿名内部类&#xff0c;实现Runnable接口 五、lambda表达式 六、实现Callable接口 七、使用线程池创建线程 前言 属于基…

末端工具重力辨识

辨识工具重力 法一&#xff1a;6点标定 已知&#xff0c;工件重力在世界坐标系的大小为{0,0,−G}\{0,0,-G\}{0,0,−G},假设工件重心在工具坐标系下的坐标为 {Lx,Ly,Lz}\{L_x,L_y,L_z\}{Lx​,Ly​,Lz​}&#xff0c;重力在工件的三个坐标轴分量为 {Gx,Gy,Gz}\{G_x,G_y,G_z\}{G…

Docker安装MySQL8数据库

&#x1f388; 作者&#xff1a;互联网-小啊宇 &#x1f388; 简介&#xff1a; CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作&#xff0c;擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护…

为什么要拒绝嵌套代码?

linux 内核的最早作者 linus torvalds 在 linux 内核样式指南 第一节中提到&#xff1a; if you need more than 3 levels of indentation, you’re screwed anyway, and should fix your program. 如果你需要超过3级的缩进&#xff0c;你无论如何都搞砸了&#xff0c;应该修复…

ABBYY15免费照片识别文字识别软件

照片识别文字的软件有哪些&#xff1f;在日常的工作的时候&#xff0c;小伙伴们是不是经常会借助拍摄照片记录一些比较重要的事情或者是一些比较重要的笔记&#xff0c;等回头空闲出来的时候在去整理&#xff0c;那么这时候&#xff0c;如果我们运用好图片识别文字这项技术&…

线性代数篇

主线为花书第二章-线性代数&#xff0c;但其上面一些表述属实费解&#xff0c;于是参考B站3Blue1Brown线性代数和B站同济子豪兄的视频讲解。 先放一句3B1B的话共勉&#xff0c;伙计们不要被数学公式吓到&#xff0c;慢慢钻研&#xff0c;慢慢推肯定能学懂。线性代数这一部分相信…

cannot redeclare block-scoped variable

使用 Vue3.0 的时在模块类中声明方法的时候抛出了如下的异常:cannot redeclare block-scoped variable解决办法检查是否集成了 Vetur 插件,若存在禁用或卸载即可,该插件Vue3.0 的时候会冲突;Vue3.0 集成如下两款即可:名称: TypeScript Vue Plugin (Volar)ID: Vue.vscode-typesc…

Qt 自定义控件 带UI 不带 UI

一般自定义控件原因 有时Qt 现有控件不能满足我们的开发需求&#xff0c;这时候就需要我们进行自定义控件的使用&#xff0c;自定义控件,这大大提高了设计UI的通用性,程序利用&#xff0c;封装&#xff1b; Part1 easy one 继续 Lab 自定义Label控件&#xff1a;文本太长省略…

机械设备管理系统如何帮助企业做好成本核算管理?

随着多元化市场经济的深入发展&#xff0c;机械设备制造企业面临的竞争压力也越来越大&#xff0c;企业要想在激烈的市场环境中生存下去&#xff0c;就得不断提高竞争力。企业提高自身竞争能力最为重要一个途径便是不断提高企业的成本核算及管控能力&#xff0c;降低企业经营成…

java使用导出百万级别数据

用过POI的人都知道&#xff0c;在POI以前的版本中并不支持大数据量的处理&#xff0c;如果数据量过多还会常报OOM错误&#xff0c; 这时候调整JVM的配置参数也不是一个好对策&#xff08;注&#xff1a;jdk在32位系统中支持的内存不能超过2个G&#xff0c;而在64位中没有限制&a…

栈、堆、全局区/静态存储区、常量区、代码段、到底是什么?

一、程序运行内存分布图 我们知道一个由我们编写好的程序&#xff0c;运行时&#xff0c;我们的程序中写的代码&#xff0c;定义的变量&#xff0c;写的函数、for 循环等等&#xff0c;这些运行时都分布在内存中的哪里吗&#xff1f; 一下是一个程序运行时 内存的各个区域的分…

C语言字符串指针(指向字符串的指针)详解

C语言中没有特定的字符串类型&#xff0c;我们通常是将字符串放在一个字符数组中&#xff0c;这里演示一下&#xff1a;#include<stdio.h> #include<string.h>intmain(){ char str[]"http://csdn.net"; int len strlen(str), i; //直接输出字符串 printf…

一套完全开源,支持多租户,界面配置单点的后端框架JVS,赶紧收藏

今天推荐的这个项目是「JVS数据全家桶中的 JVS微服务框架」—— 是一个免费开源的中后台模版&#xff0c;使用了最新的 vuespring cloud 主流技术开发&#xff0c;开箱即用的中后台前端解决方案&#xff0c;可以直接商用&#xff0c;并且这个脚手架上做了很多商业上的扩展&…

day19 二叉树 | 654、最大二叉树 617、合并二叉树 700、二叉搜索树中的搜索 98、验证二叉搜索树

题目 654、最大二叉树 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下&#xff1a; 二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。 通过给定的数组构…

数据中心转型利润中心:数据如何赋能零售行业营销升级?

通过大数据来提升营销效果已经是零售行业不同业态都绕不过去的话题。以往&#xff0c;市场团队在进行投放时需要依靠营销团队和销售团队的经验来判断&#xff0c;这样的营销策略较为粗放&#xff0c;对用户的感知也不精准&#xff0c;一般都是在海量投放后被动的等待营销反馈。…

C++代码优化(2):条款5~12

"然后自然老去吧&#xff0c;别再依依惜别了"条款5:了解C默默编写并调用了哪些函数(1)小试牛刀地回顾C编译器为类提供的默认函数很多人知道是有6个的。默认构造、拷贝构造、赋值重载、析构函数、重载取地址运算符&#xff0c;但是在C11更新后&#xff0c;又为类对象增…

软件测试项目实战,我们拿到项目第一步应该怎么做【附过程文档】

对于从事软件研发的组织来说&#xff0c;工作类型至少包括项目管理、产品设计、编码、测试、质量保证和软件配置管理&#xff0c;以及其它人员&#xff0c;如文档编制人员和美工人员/系统硬件管理人员等。根据职能需要&#xff0c;可以以半独立方式进行部门和项目的矩阵管理&am…

Let’s Encrypt共建安全的互联网

导读最近关于沃通和 StartCom 这两家 CA 公司的消息让人们再次关注到了网络隐私和安全的问题。随着 Mozilla、苹果和谷歌对这两家 CA 公司处罚落定&#xff0c;很多使用这两家 CA 所签发证书的网站纷纷寻求新的证书签发商。这里面固然有不少可信赖的 CA 公司可以提供服务&#…

UniRx之基本语法格式

前言 想要更好的去学习UniRx&#xff0c;我们最好是先理解UniRx 的语法格式。就像我们去学习英语或者汉语一样&#xff0c;理解了基本的语法规则后&#xff0c;再学其他的就信手拈来了。 语法示例 下面我们来看一个最简单的示例&#xff0c; Observable.EveryUpdate().Where…

Git安装,配置及Gitee项目代码pull到本地

一、Git安装从git官网下载&#xff1a;https://git-scm.com/downloads选择适合的版本进入下载&#xff0c;然后傻瓜式安装直到结束。检查安装是否成功&#xff1a;进入任意文件夹点击右键选择Git Bash Here进行基本配置输入如下命令&#xff1a;git --version就会显示当前安装的…