第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-380 绘制地图
前言
这段时间我会把蓝桥杯官网上的所有非VIP题目都发布一遍,让大家方便去搜索,所有题目都会有几种语言的写法,帮助大家提供一个思路,当然,思路只是思路,千万别只看着答案就认为会了啊,这个方法基本上很难让你成长,成长是在思考的过程中找寻到自己的那个解题思路,并且首先肯定要依靠于题海战术来让自己的解题思维进行一定量的训练,如果没有这个量变到质变的过程你会发现对于相对需要思考的题目你解决的速度就会非常慢,这个思维过程甚至没有纸笔的绘制你根本无法在大脑中勾勒出来,所以我们前期学习的时候是学习别人的思路通过自己的方式转换思维变成自己的模式,说着听绕口,但是就是靠量来堆叠思维方式,刷题方案自主定义的话肯定就是从非常简单的开始,稍微对数据结构有一定的理解,暴力、二分法等等,一步步的成长,数据结构很多,一般也就几种啊,线性表、树、图、再就是其它了。顺序表与链表也就是线性表,当然栈,队列还有串都是属于线性表的,这个我就不在这里一一细分了,相对来说都要慢慢来一个个搞定的。蓝桥杯中对于大专来说相对是比较友好的,例如三分枚举、离散化,图,复杂数据结构还有统计都是不考的,我们找简单题刷个一两百,然后再进行中等题目的训练,当我们掌握深度搜索与广度搜索后再往动态规划上靠一靠,慢慢的就会掌握各种规律,有了规律就能大胆的长一些难度比较高的题目了,再次说明,刷题一定要循序渐进,千万别想着直接就能解决难题,那只是对自己进行劝退处理。加油,平常心,一步步前进。
绘制地图
资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
最近,WYF正准备参观他的点卡工厂。WYF集团的经理氰垃圾需要帮助WYF设计参“观”路线。现在,氰垃圾知道一下几件事情:
1.WYF的点卡工厂构成一颗二叉树。
2.一共有n座工厂。
3.他需要把这颗树上的点以后序遍历的方法列出来,才能绘制地图。
还好,最近他的属下给了他先序遍历和中序遍历的数据。可是,氰垃圾最近还要帮㊎澤穻解决一些问题,没有时间。请你帮帮他,替他完成这项任务。由于氰垃圾的一些特殊的要求,WYF的参观路线将会是这棵树的后序遍历。
输入格式
第一行一个整数n,表示一共又n座工厂。
第二行n个整数,表示先序遍历。
第三行n个整数,表示中序遍历。
输出格式
输出共一行,包含n个整数,为后序遍历。
样例输入
8
1 2 4 5 7 3 6 8
4 2 7 5 1 8 6 3
样例输出
4 7 5 2 8 6 3 1
数据规模和约定
0<n<100000,。保证先序遍历和中序遍历合法,且均为1~n
题解:
C语言
#include <stdio.h> int a[100001],b[100001],c[100001],k=0; void fac(int l,int r,int t,int map[]) { if(l<=r) { int j=t-(r-l); int i=map[a[j]]; c[k++]=b[i]; fac(i+1,r,t,map); fac(l,i-1,t-(r-(i+1)+1),map); } } int main() { int i,n,map[100001]; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]); for(i=1;i<=n;i++) scanf("%d",&b[i]),map[b[i]]=i; fac(1,n,n,map); for(i=k-1;i>=0;i--) printf("%d ",c[i]); return 0; }
C++语言
#include<stdio.h> #include<math.h> #include<algorithm> int n,m,i,j,k,ans; int sl[100005],sr[100005],a[100005],c[100005],b[100005],s; void ss(int l,int r,int fa) { if (l+1==r)return; if (c[a[i]]>=r||c[a[i]]<=l) return; int lo=c[a[i]],de=a[i]; if (c[fa]==r) sl[fa]=a[i]; else sr[fa]=a[i]; i++; ss(l,lo,de); ss(lo,r,de); } void pr(int o) { if (sl[o]!=0) pr(sl[o]); if (sr[o]!=0) pr(sr[o]); printf("%d ",o); } int main() { scanf("%d",&n); for (i=1;i<=n;i++) { scanf("%d",&a[i]); } for (i=1;i<=n;i++) { scanf("%d",&b[i]); c[b[i]]=i; } i=2; s=c[a[1]]; ss(0,s,a[1]);ss(s,n+1,a[1]); pr(a[1]); return 0; }
Java语言
在扫描输入内容上会有不同的方法,但是与Scanner的用法是相同的。
import java.util.HashMap; import java.util.HashSet; import java.util.Scanner; import java.util.Set; import java.util.Stack; public class Main { /* * 通过前序遍历数组和中序遍历数组直接得出后续遍历数组 */ public void poCons(int[] pre, int[] mid) { Stack<Integer[]> s = new Stack<Integer[]>(); Set<Integer> set = new HashSet<Integer>(); HashMap<Integer,Integer> map = new HashMap<Integer,Integer>(); for(int i=0;i<mid.length;i++) map.put(mid[i], i); set.add(-1); set.add(pre.length); for(int i:pre) { int loc = map.get(i); set.add(loc); s.add(new Integer[] {i, loc}); while(!s.isEmpty() && set.contains(s.peek()[1]-1) && set.contains(s.peek()[1]+1)) System.out.print(s.pop()[0]+" "); } } public static void main(String[] args) { Scanner scan = new Scanner(System.in); int n = scan.nextInt(); int[] pre = new int[n]; int[] mid = new int[n]; for(int i=0; i<n; i++) pre[i] = scan.nextInt(); for(int i=0; i<n; i++) mid[i] = scan.nextInt(); new Main().poCons(pre, mid); } }
Python语言
相对简洁,但是需要对Python的一些语法很了解,特别是列表推导式的熟悉。
class BTree: left = None right = None def __init__(self, v): self.val = v n = int(input()) front_input = list(input().split()) front_seq = [] for i in range(n): front_seq.append(int(front_input[i])) mid_input = list(input().split()) mid_seq = [] for i in range(n): mid_seq.append(int(mid_input[i])) root = BTree(front_seq[0]) idx = 0 stack = [root] for i in range(1, len(front_seq)): val = front_seq[i] node = stack[-1] if node.val != mid_seq[idx]: node.left = BTree(val) stack.append(node.left) else: while stack and stack[-1].val == mid_seq[idx]: node = stack.pop() idx += 1 node.right = BTree(val) stack.append(node.right) s = [] res = [] cur = root while cur or s: while cur: res.append(str(cur.val)) s.append(cur) cur = cur.right if s: cur = s.pop() cur = cur.left res.reverse() print(" ".join(res))
总结
没有什么不付出就能拿到的结果,我们都是在负重前行,最终结果与自身先天的脑力有一定的关系,但是还是有很大一部分看自己后天的努力,其实从报名到比赛也就5个月左右,真正刷题的事件也就2个月,2个月回忆一下你真正的认真刷过题吗,如果你真的用尽所有的精力去努力了,那么我相信你最终的成绩一定会让你满意的,加油。