P10124 [USACO18OPEN] Family Tree B 题解

news/2024/11/17 21:59:58/文章来源:https://www.cnblogs.com/panda-lyl/p/18551211

思路

这道题目很像找 \(2\) 头牛的最近公共祖先,即 lca, 但是并不用那么麻烦.

因为数据很小,我们可以写一个 山寨版 的 lca.具体如下.

int mother(string x, string y) {int res = 0;while (y != "") { // 有名字的牛if (x == y) return res; // 两头牛的名字相等,说明是同一头牛,返回步数y = find_mom(y); // y 去找它的母亲res++; // 步数++}return -1; // 没找到
}

先说下 find_mom 这个函数的功能.

string find_mom(string cow) {for (int i = 1; i <= n; i++) if (cow == son[i]) return mom[i];return "";
} 

就是找一头牛的母亲,如果没有找到,返回空白字符串.

再讲一下 son[i] 和 mom[i].

son[i] 存储孩子,mom[i] 存储母亲.

言归正传,首先 y != "" 是要表明这头牛是在数组中的.

res 是用来存 y 到 x 的步数.所以,在这个函数中,\(x\)不动的\(y\) 是在 的.

因为题目中的输出是遵循 年纪老的在前,年轻牛在后,所以我们需要存储 \(2\) 个变量.

\(sx\), \(sy\),分别表示 \(x\), \(y\) 到它们的 最近公共祖先的步数.

基本操作顺序

第一次,我们先假设 lca 为奶牛 x. 如果 lca 不为空且它和奶牛 y是有直系关系的,那么不用在找了.

否则,我们动 lca,步数存在 \(sx\) 中.

如果退出循环后 lca 为空,说明 x 和 y 没有关系.

然后我们就可以去查询 y 到 lca 的步数,即 \(sy\).

判断

如果 sx 和 sy 的值均为 1,说明它们只需要各动 1 步就到 lca 了,也就是说,它们是姐妹关系.

如果两个值均大于 1,那就是 cousin 的关系了.

这两个关系在题目中的图片就可以明白.

接下来就是 great great .... grand mother / aunt 关系了.

先根据 \(sy\)\(sx\) 区分前辈和后辈.因为题目中是以 y 为后辈,所以,当 \(sy > sx\) 时,就要互换身份了.

接下来输出 \(t\)great-.

\(t\)\(sx - 2\) 个. 为什么? 首先 x 时后辈,并且 mothergrand-mother 不需要 grant,所以要减 \(2\).

然后判断要不要输出 grand.

因为只有直系关系才有 grand, 所以当 \(sx > 1\) 并且 \(sy = 0\) 时,才输出 grand.

\(sx > 1\) 是因为 mother 没有 grand, 只有mother 的 mother 及以上才有 grand.

\(sy = 0\) 是为了区分 mother 和 aunt.

然后如果 \(sy = 0\),再输出 mother,否则就是 aunt.

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>using namespace std;int n;
string x, y;
string lca; // 存公共祖先 
string mom[102], son[102];
int sx, sy;string find_mom(string cow) {for (int i = 1; i <= n; i++) if (cow == son[i]) return mom[i];return "";
} int mother(string x, string y) {int res = 0;while (y != "") {if (x == y) return res;y = find_mom(y);res++;}return -1;
}int main() {cin >> n >> x >> y;for (int i = 1; i <= n; i++)cin >> mom[i] >> son[i];lca = x;while (lca != "") { // 没有跑出族谱 if (mother(lca, y) != -1) break;lca = find_mom(lca);sx++;}if (lca == "") {printf("NOT RELATED");return 0;}int sy = mother(lca ,y);if (sx == 1 && sy == 1) printf("SIBLINGS");else if (sx > 1 && sy > 1) printf("COUSINS");else {if (sy > sx) swap(x, y), swap(sx, sy);printf("%s is the ", y.c_str());for (int i = 1; i <= sx - 2; i++) printf("great-");if (sx > 1 && sy == 0) printf("grand-");if (sy == 0) printf("mother");else printf("aunt");printf(" of %s", x.c_str());}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【伪造检测】Noise Based Deepfake Detection via Multi-Head Relative-Interaction

一、研究动机[!note] 动机:目前基于噪声的检测是利用Photo Response Non-Uniformity (PRNU)实现的,这是一种由于相机感光传感器而造成的缺陷噪声,主要用图像的源识别,在伪造检测的任务中并没有很好的表现。因此在文中提出了一种基于伪造噪声痕迹的检测算法。 实现原理:通过…

11月17日

今日错误错误原因:没有分辨出两个单词词性上的含义与区别,对于什么语境该用什么做区分不清

超实用的SpringAOP实战之日志记录

AOP使用场景的本质是:在一个`方法`的执行前、执行后、执行异常和执行完成状态下,都可以做一些`统一的操作`。AOP 的核心优势在于将这些横切功能从核心业务逻辑中提取出来,从而实现代码的`解耦`和`复用`,提升系统的`可维护性`和`扩展性`。本文主要以日志记录作为切入点,来讲…

2024/11/17 总结

记忆宫殿初始入度为\(0\)的点为源点。 我们令 \(S\) 为如果成立,就能够推出事件的源点集合。 当事件成立时,显然 \(S\) 中的点必有至少一个是真的。所以我们只要把所有包含 \(S\) 的事件都标记为真就行了。 Pro-Professor Szu 某大学校内有一栋主楼,还有 栋住宅楼。这些楼之…

# [团队项目Scrum冲刺-day7]

每天举行站立式会议昨天已完成的任务成员 任务徐嘉炜 优化登录界面交互逻辑陈祥意 对各个测试模块测试林楦 优化整体UI界面陈大锴 优化注册界面交互逻辑蔡家显 检查测试记录陈祖民 优化登录UI肖商 反馈前一天测试结果今日计划完成的任务成员 任务林楦 优化前端页面显示陈祖民 优…

HBase的常用命令

一、general类 1、查看集群的状态 status2、查看数据库版本 version3、显示当前用户和组 whoami4、查看操作表的命令 table_help5、退出hbase exit或者ctrl+c 二、DDL相关 注:DDL是用于定义和管理数据库中的结构的命令,例如创建,删除,修改表等操作 1、创建表 注:创建表的时…

用户故事与敏捷开发

什么是用户故事 用户故事(User Story)是用来对软件或用户有价值功能的简短描述,是对需求的一种描述。它清晰简洁的传达了用户想要的功能。 它从用户角度出发,用来描述用户的需求,用来表达用户需求的方式之一。 它从用户角度出发,解释了用户所期望得到的结果。用户故事清楚…

团队项目冲刺--day6

每天举行站立式会议成员 任务##昨天已完成的工作成员 任务徐嘉炜 开发音频API交互逻辑陈祥意 测试网络API林楦 开发注册UI界面陈大锴 开发系统界面交互逻辑蔡家显 汇总整体测试记录陈祖民##今天计划完成的工作 界面细节完善,如歌曲封面动画,歌曲播放,页面背景随封面渐变,歌…

11.17 鲜花

a pa ta ? zaong ma ze mi da. (byd 没有输入法绷不住了)11.17 鲜花(RMQ专题) 哈哈,回家看到朴彩英这个歌绷不住了。 不是吧,姐?推歌-박채영《아파트》 채영이가 좋아하는 랜덤 게임 랜덤 게임 Game start 아파트 아파트 아파트 아파트 아파트 아파트 Uh, uh huh uh huh …

团队作业4——项目冲刺-7

目录 每日例会 1.1 例会照片 1.2 成员工作情况 2.燃尽图 3.代码签入 4.最新模块 4.1 代码截图 4.2 运行截图 5.每日总结 每日例会 1.1 例会照片1.2 成员工作情况成员 昨日已完成工作 今天计划完成的工作 工作中遇到的困难杨殷(组长) 完善管理员界面增删改查功能 完善整个系统…

jmeter接口测试之SSH Command

原文地址:https://download.csdn.net/blog/column/8863406/106334136 需要提前安装好的工具:按照好jmeter插件:ssh protocol support 、 sshmon samler Collector 然而在实际测试中,不能确定我们的的机器能够正常连接。这里就要用到 while 循环设置重连,如下添加 while …

团队项目冲刺第七天

课程 2024软件工程作业要求 团队作业4——项目冲刺作业目标 团队项目冲刺第七天团队会议合照燃尽图计划表格成员 已完成 下一步洪吉潮 话题发布与展示功能开发开发话题详情页面的前端展示刘家辉 话题发布与展示功能开发实现话题在主题圈和校园圈的展示逻辑柳浩 前后端对接,进行…