建图+DFS

题目链接:https://www.patest.cn/contests/gplt/L2-007

题解

在热身赛的时候没有做出来,用的并查集的思想,但是敲残了,最后也没整出来。赛后听到别人的解题思路,感觉挺有收获的。利用每个人的关系可以建立一个无向图,最后用DFS遍历这个图,就能知道有几个连通分量,即家庭的数目。

当一个解题思想耗费差不多一个小时还没敲出来,可能你的大致思想确实可以将这个题目解出来,但是你目前的状态还不能很好的解决这个问题。例如这个题,一看题目就知道这个是跟并查集有关的,然后就一头扎进去,到最后也没有解出来,虽然确实可以用并查集解决这个题目。

这个时候我们应该多想想看,能否将这个题目转化成另外一种思想从而能够更好的解决,有意识的训练自己的发散思维,在平时的练习中对一个题目进行一题多解。

代码如下:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int maxn = 10000;
const int inf = 0x3f3f3f3f;
bool vis[maxn];
double house[maxn],area[maxn];
vector<int> v[maxn];
int n, min_id, cnt;
double sum_house, sum_area; struct Node {
int id, sum_person;
double avg_house, avg_area;
Node(){}
Node(int a, int b, double c, double d) {
id = a;
sum_person = b;
avg_house = c;
avg_area = d;
}
};
vector<Node> ans;
bool cmp(Node A, Node B) {
if(A.avg_area != B.avg_area) return A.avg_area > B.avg_area;
else return A.id < B.id;
}
void dfs(int x) {
vis[x] = false;
min_id = min(min_id, x);
cnt++;
sum_house += house[x];
sum_area += area[x]; int len = v[x].size();
for(int i = 0; i < len; i++) {
if(vis[v[x][i]]) {
dfs(v[x][i]);
}
}
} int main() {
scanf("%d", &n);
memset(vis, 0, sizeof(vis));
for(int i = 0; i < maxn; i++) v[i].clear();
int id, fa, mo, num, kid;
for(int i = 0; i < n; i++) {
scanf("%d%d%d%d", &id, &fa, &mo, &num);
vis[id] = true;
if(fa != -1) {
v[id].push_back(fa);
v[fa].push_back(id);
vis[fa] = true;
}
if(mo != -1) {
v[id].push_back(mo);
v[mo].push_back(id);
vis[mo] = true;
}
for(int j = 0; j < num; j++) {
scanf("%d", &kid);
v[id].push_back(kid);
v[kid].push_back(id);
vis[kid] = true;
}
scanf("%lf%lf", &house[id], &area[id]);
}
ans.clear();
int kase = 0;
for(int i = 0; i < maxn; i++) {
if(vis[i]) {
kase++;
min_id = inf; cnt = 0; sum_house = sum_area = 0;
dfs(i);
Node node = Node(min_id, cnt, sum_house/cnt, sum_area/cnt);
ans.push_back(node);
}
}
sort(ans.begin(), ans.end(), cmp);
printf("%d\n", kase);
int len = ans.size();
for(int i = 0; i < len; i++) {
printf("%04d %d %.3lf %.3lf\n", ans[i].id, ans[i].sum_person, ans[i].avg_house, ans[i].avg_area);
}
return 0;
}

PAT 天梯赛 L2-007 家庭房产的更多相关文章

  1. PAT天梯赛 L1-049 天梯赛座位分配

    题目链接:点击打开链接 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] ...

  2. PAT天梯赛L3-007 天梯地图

    题目链接:点击打开链接 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至 ...

  3. PAT天梯赛练习题——L3-007. 天梯地图(多边权SPFA)

    L3-007. 天梯地图 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校 ...

  4. PAT 天梯赛 L2-007. 家庭房产 【并查集】

    题目链接 https://www.patest.cn/contests/gplt/L2-007 思路 将一个家庭里的所有人都并进去 然后最后查找的时候 找到所有同一个家庭的人,计算出人数,人均房产套数 ...

  5. PAT天梯赛L2-007 家庭房产

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

  6. pat 团体赛练习题集 L2-007. 家庭房产

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

  7. PAT天梯赛练习题 L3-002. 堆栈(线段树查询第K大值或主席树)

    L3-002. 堆栈 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 大家都知道“堆栈”是一种“先进后出”的线性结构,基本操作有 ...

  8. PAT天梯赛练习题 L3-010. 是否完全二叉搜索树(完全二叉树的判断)

    L3-010. 是否完全二叉搜索树 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 将一系列给定数字顺序插入一个初始为空的二叉搜 ...

  9. PAT天梯赛练习题 L3-011. 直捣黄龙(多关键字SPFA+DFS)

    L3-011. 直捣黄龙 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题是一部战争大片 —— 你需要从己方大本营出发,一路 ...

随机推荐

  1. [阿当视频]WEB组件学习笔记

    — 视频看完了,自定义事件还不懂,等完全懂了再更新并完成整篇案例 1. JS分层和组件的种类浏览器底层包括HTML CSS JS(DOM/BOM/Style/Canvas 2D/WebGl/SVG) ...

  2. lsof使用

    用netstat命令去统计服务器目前的网络连接状态 netstat -n|awk '/^tcp/{++S[$NF]}END{for(a in S) print a,S[a]}'   netstat - ...

  3. incomplete type is not allowed

    keil环境下,报错#70: incomplete type is not allowed,解决 mqtt_conf.h 定义了一个结构体 mqtt_buffer.h #include <std ...

  4. Android使用Apache的httpmime包post提交数据

    /** * 启动线程向服务器post提交数据 */ public void upLoadPic(final Intent data) { ToastUtils.toastWithMessage(get ...

  5. mysql 分组按条件统计

    百度经验 COUNT(CASE WHEN (S.rank = 1) THEN S.loanContractId END ) AS 'MZ',  //根据loanContractId 分组,并统计ran ...

  6. python操作---RabbitMQ

    RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列(MQ)是一种应用程序 ...

  7. C#读取Excel的其中一种方式OleDb读取(100万条)--快速大量插入SQL中

    主要运用表类型 Create table BulkTestTable( Id nvarchar(), UserName nvarchar(), Pwd nvarchar() ) Go CREATE T ...

  8. Maxwell顺态求解器电磁力分析

    文源:技术邻 问题描述:求解一段通有正弦交流电的直导线在某一稳态磁场中的受力情况,并简单验证仿真结果. 模型介绍: 如上几何模型中10mm边长立方体代表永磁体,材料属性为材料库中的NdFe35,修改磁 ...

  9. 淘淘商城_day10_课堂笔记

    今日大纲 Dubbo入门学习 使用dubbo优化单点登录系统 系统间服务调用方式 浏览器直接访问 浏览器发起请求,通过ajax或jsonp方式请求: Httpclient方式 系统与系统之间通过Htt ...

  10. AnimatorController动画融合树

    通过Unity动画状态机,能帮我们轻松处理转换各个动画片断,达到想要的效果,但是如果仅仅是一个个动画的硬生生的切换,那么看起来就非常突然,而不真实了,在质量要求比较高的游戏中,特别是动作游戏,我们就不 ...