L2-026 小字辈
L2-026 小字辈 (25 分)
本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。
输入格式:
输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) —— 简单起见,我们把家族成员从 1 到 N 编号。随后第二行给出 N 个编号,其中第 i 个编号对应第 i 位成员的父/母。家谱中辈分最高的老祖宗对应的父/母编号为 -1。一行中的数字间以空格分隔。
输出格式:
首先输出最小的辈分(老祖宗的辈分为 1,以下逐级递增)。然后在第二行按递增顺序输出辈分最小的成员的编号。编号间以一个空格分隔,行首尾不得有多余空格。
输入样例:
9
2 6 5 5 -1 5 6 4 7
输出样例:
4
1 9
解题思路:这题就相当于一棵树,找最底层的结点,以及深度。。最先开始想到的就是从子节点(没有孩子)开始逐一遍历比较,最后提交的时候发现超时了。。。那就只能重新写了,从根节点(所谓的老祖宗)开始,然后进行搜索,用数组记录每个人的辈分,maxx记录最低辈分。。。
代码如下:
超时代码:从子节点开始
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e5+5;
int a[maxn];
struct P{int x,y;//记录编号和辈分
}s[maxn];
int vis[maxn];
bool cmp(P a,P b)
{if(a.y==b.y)return a.x<b.x;return a.y>b.y;
}
int main()
{int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);if(a[i]!=-1)//标记有孩子的人vis[a[i]]=1;}int maxx=0;for(int i=1;i<=n;i++){s[i].x=i;s[i].y=1;if(vis[i]) continue;int f=a[i];while(f!=-1)//查找辈分{s[i].y++;f=a[f];}if(s[i].y>maxx)maxx=s[i].y;}//sort(s+1,s+n+1,cmp);printf("%d\n",maxx);int f=0;for(int i=1;i<=n;i++){if(s[i].y==maxx){if(f) printf(" ");printf("%d",s[i].x);f=1;}}printf("\n");return 0;
}
正确代码:从根节点开始
#include<stdio.h>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e5+5;
vector<int>V[maxn];
int s[maxn];
int maxx=0;
void dfs(int ans)
{if(V[ans].empty()){maxx=max(maxx,s[ans]);return;}for(int i=0;i<V[ans].size();i++){s[V[ans][i]]=s[ans]+1;//当前人的辈分等于他父母亲的辈分再加1dfs(V[ans][i]);}
}
int main()
{int n,a;scanf("%d",&n);int ans=1;for(int i=1;i<=n;i++){s[i]=1;scanf("%d",&a);if(a!=-1)V[a].push_back(i);elseans=i;}dfs(ans);printf("%d\n",maxx);int f=0;for(int i=1;i<=n;i++){if(s[i]==maxx){printf(f ? " %d" : "%d",i);f=1;}}printf("\n");return 0;
}
L2-026 小字辈相关推荐
- 天体赛练习集 简要题解 - L2
目录 001 - 紧急救援 002 - 链表去重 003 - 月饼 004 - 这是二叉搜索树吗? 005 - 集合相似度 006 - 树的遍历 007 - 家庭房产 008 - 最长对称子串 009 ...
- 【L2-026 小字辈】天梯赛L2系列详解
天梯赛L2-026 小字辈 (25 分) 题目详情: 输入样例: 9 2 6 5 5 -1 5 6 4 7 输出样例: 4 1 9 思路: 这个题目当时写了一种递归的方法,但是递归的不好,测试数据太大 ...
- 团体程序设计天梯赛 L2 题目合集
前言 发现自己还能再参加一次天梯赛,在高兴之余,决定把在赛前将所有的天梯赛真题过一遍,希望自己可以取得理想的成绩.目前 L1 的题目已经刷完,打算在赛前刷完 L2 的题目. 本来想 L2 的题目都写个 ...
- 【CCCC】PAT : 团体程序设计天梯赛-练习集 L2 答案,题解,附代码
[CCCC]PAT : 团体程序设计天梯赛-练习集 L2 答案 鉴定完毕,全部水题 ヾ(•ω•`)o 知识点分类(32): 1.树锯结构(9):二叉树的存储,编号,遍历顺序转换,求深度,底层节点,从底 ...
- CCCC 天梯赛 PTA ZOJ 题目 L1 L2 L3
PTA 天梯赛题目整理 L2 难点 **L2-001 紧急救援** **L2-002 链表去重** **L2-003 月饼** **L2-004 这是二叉搜索树吗** **L2-005 集合相似度** ...
- 团体程序设计天梯赛-L2组
团体程序设计天梯赛-L2组 -------------------------------------------------------------------------------- 题目传送门 ...
- 团体程序设计天梯赛 -- 练习集 (L2合集)
文章目录 L2-001 紧急救援 (25 分) L2-002 链表去重 (25 分) L2-003 月饼 (25 分) L2-004 这是二叉搜索树吗? (25 分) L2-005 集合相似度 (25 ...
- PTA L2 题目合集
L2-001 紧急救援 (25 分) 题解链接 L2-002 链表去重 (25 分) #include<bits/stdc++.h> #define PIS pair <int, s ...
- 什么是L1/L2/L3 Cache?
什么是L1/L2/L3 Cache? Cache Memory也被称为Cache,是存储器子系统的组成部分,存放着程序经常使用的指令和数据,这就是Cache的传统定义.从广义的角度上看,Cache是快 ...
- 智能驾驶L2发展策略
智能驾驶L2发展策略 智能驾驶L2,以们通俗的定义是,以高级辅助驾驶的产品为主的各种巡航产品,包括定速巡航,自适应巡航ACC,预见性巡航,智能巡航等等. 车辆驾驶是集注意力高度集中,手把控方向盘和换挡 ...
最新文章
- JQuery实现表格行当复制
- C++语言之继承中的特点
- quit推不出mysql_cmd下使用mysql插入中文出现无法退出语句的情况!终极解决办法! 安装mysql详细教程。...
- python字典的用法_Python字典的用法详解(附示例)
- [转]自定义ASP.NET MVC Html辅助方法
- 文件操作-使用readline分行读取大文件
- Django从理论到实战(part47)--ListView类
- 从Jupyter Notebook到脚本
- sme是什么职位_学云计算能从事哪些岗位 未来职业发展是什么样
- 快来了解下Snappy Ubuntu是什么
- C# winForm utf8 gbk 相互转码小工具
- python语法简洁清晰、特色之一是强制用作为语句缩进_问道python之基础篇【一】 认识python...
- Mybatis学习笔记(完结)
- 软件测试系统主要包括哪几项内容,系统测试包含哪几部分?
- Kubernetes 安全容器技术 kata gvisor
- C++——Hook教程[1]:虚函数表(VMT)Hook
- matlab语法介绍——fft()、ifft()、fftshift()
- python画小狗代码_用Python画一只有点方的小狗狗——turtle库circle()函数实践
- mysql8修改密码之后无法登陆_解决MySQL8.0安装第一次登陆修改密码时出现的问题...
- SpringBoot---MongoDB的简单使用