PAT甲级1114 Family Property:[C++题解]结构体、并查集、测试点3、4、5有问题的进来!!

本文主要是介绍PAT甲级1114 Family Property:[C++题解]结构体、并查集、测试点3、4、5有问题的进来!!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 题目分析
    • 题目链接

题目分析

在这里插入图片描述
在这里插入图片描述
来源:acwing

分析:

  1. 先建边。读入每家的信息,在本人和父母(如果有的话),本人与子女(如果有的话)之间分别建边。边用结构体来存,边记录两个端点。
  2. 遍历每条边合并集合,分成一个一个家庭。这里的“遍历每条边”,指的是遍历两条边的端点(户主,或父母,或子女),利用find()函数合并,这里把id大的挂到id小的上面,这样,根结点就是答案所求的户主id。
  3. 将每个家庭存入vector,排序输出即可。为此,需要一个Family结构体,里面存户主id,家庭人数c,家庭房子数量hc,家庭房子面积ha,并重载小于号进行排序。

需要注意的点:

  1. 用int表示id,不用string。起初想用string来表示id,发现较为麻烦。原因有二,一是用string之后,用并查集之后还需要一步从string到int 的映射,教麻烦。二是题目明确每个id都是4位数,并且各不相同,这是变相地给我们降级难度,提示我们使用int。
  2. 家庭户主的id是编号最小的。由于我们是用并查集做的,这就提示我们只维护一个最小的id即可,其他id在统计到各个家庭之后没有什么用。在并查集中,合并的时候把较大的root接到较小的root上,这样得到的root就是最小的root。
  3. 前导0的输出,万能C语言!!!由于用int来存的id,如果像0004这样婶儿的,存的只是4,这就考验我们的格式化输出能力。使用printf("%04d",a);含义是以4位宽度输出数a,不足4位的在前面补0!

补充:printf("%4d",id)表示输出宽度为4,且右对齐,不足的在前面补空格。当变量的实际宽度大于4时,输出变量的所有数字.

ac代码

#include<bits/stdc++.h>
using namespace std;
const int N = 10010; //边的数量
int n;
int p[N]; //并查集父亲数组
int  c[N];//c[i]表示i这家人的人数 count
int hc[N];//房子数量 house count
int ha[N]; //房子面积 house area
bool st[N];// 户主 和父母,子女分别建边
struct Edge{int a, b;
}e[N];// 一家人放在一个结构体中,排序使用
struct Family{int id ,c ,hc, ha;bool operator<(const Family & t)const{// ha /c , t.ha/t.cif( ha * t.c != c * t.ha) return ha * t.c > c* t.ha;return id < t.id;}
};//并查集找根
int find(int x){if(p[x]!= x) p[x] = find(p[x]);return p[x];
}int main(){cin >>n;int m =0; //表示边数//第一部分: 读入所有输入,并建边for(int i = 0; i < n; i++){int id , father ,mother, k;cin >> id >> father >> mother >>k;//标记id出现过st[id] = true;if(father != -1) e[m++] = {id,father};if(mother != -1) e[m++] = {id,mother};for(int j = 0 ;j< k; j++){int son;cin >> son;e[m++] ={id,son};}cin >> hc[id] >> ha[id]; //房子数量,房子面积}//第二部分:得到每个家庭,并且户主编号最小//并查集初始化for(int i = 0; i<= N; i++) p[i] = i,c[i] =1 ;//i这家人只有1个人//遍历每条边:合并集合:得到每个家庭。for(int i = 0 ; i<m ;i++){int a = e[i].a, b = e[i].b;st[a] = st[b] = true; //标记每个点出现过//一个集合的根结点int pa = find(a),pb = find(b);//合并集合,让根结点大的集合挂到 根结点小的集合上!!//这样根结点就是编号最小的那个!!!//题目要求:ID 是家庭成员中编号最小的成员编号if(pa != pb){if(pb > pa) swap(pa,pb); //让pb成为较小的// 那么pb那个集合的值都要更新:加上pa集合的值//人数 , 房子数量,房子面积c[pb] += c[pa],hc[pb]+= hc[pa],ha[pb] += ha[pa];//pa集合挂到编号更小pb集合p[pa] = pb; }}// 第三部分:每个家庭的信息存起来,并输出vector<Family> familys;//遍历所有的点,如果之前出现过st[i] == true 并且是集合的根结点p[i] == i//代表i就是一家之主,将该家庭统计到vector中for(int i =0 ;i < N; i++){if(st[i] && p[i] == i)familys.push_back({i,c[i],hc[i],ha[i]});}//排序输出sort(familys.begin(),familys.end());cout<< familys.size()<<endl;for( auto f :familys){printf("%04d %d %.3lf %.3lf\n",f.id, f.c,(double)f.hc/f.c,(double)f.ha/f.c);}
}

在这里插入图片描述

注意:测试点3、4、5包括0000这个人。第一遍忽略了这个人,导致三个测试点错误。
在这里插入图片描述

题目链接

PAT甲级1114 Family Property
https://www.acwing.com/problem/content/1606/

这篇关于PAT甲级1114 Family Property:[C++题解]结构体、并查集、测试点3、4、5有问题的进来!!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/465809

相关文章

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

关于Nginx跨域问题及解决方案(CORS)

《关于Nginx跨域问题及解决方案(CORS)》文章主要介绍了跨域资源共享(CORS)机制及其在现代Web开发中的重要性,通过Nginx,可以简单地解决跨域问题,适合新手学习和应用,文章详细讲解了CO... 目录一、概述二、什么是 CORS?三、常见的跨域场景四、Nginx 如何解决 CORS 问题?五、基

MySQL安装时initializing database失败的问题解决

《MySQL安装时initializingdatabase失败的问题解决》本文主要介绍了MySQL安装时initializingdatabase失败的问题解决,文中通过图文介绍的非常详细,对大家的学... 目录问题页面:解决方法:问题页面:解决方法:1.勾选红框中的选项:2.将下图红框中全部改为英

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::

Nginx启动失败:端口80被占用问题的解决方案

《Nginx启动失败:端口80被占用问题的解决方案》在Linux服务器上部署Nginx时,可能会遇到Nginx启动失败的情况,尤其是错误提示bind()to0.0.0.0:80failed,这种问题通... 目录引言问题描述问题分析解决方案1. 检查占用端口 80 的进程使用 netstat 命令使用 ss

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::