Elven Postman(二叉树)
Elven Postman
Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 1091 Accepted Submission(s): 617
So, as a elven postman, it is crucial to understand how to deliver the mail to the correct room of the tree. The elven tree always branches into no more than two paths upon intersection, either in the east direction or the west. It coincidentally looks awfully like a binary tree we human computer scientist know. Not only that, when numbering the rooms, they always number the room number from the east-most position to the west. For rooms in the east are usually more preferable and more expensive due to they having the privilege to see the sunrise, which matters a lot in elven culture.
Anyways, the elves usually wrote down all the rooms in a sequence at the root of the tree so that the postman may know how to deliver the mail. The sequence is written as follows, it will go straight to visit the east-most room and write down every room it encountered along the way. After the first room is reached, it will then go to the next unvisited east-most room, writing down every unvisited room on the way as well until all rooms are visited.
Your task is to determine how to reach a certain room given the sequence written on the root.
For instance, the sequence 2, 1, 4, 3 would be written on the root of the following tree.

For each test case, there is a number n(n≤1000) on a line representing the number of rooms in this tree. n integers representing the sequence written at the root follow, respectively a1,...,an where a1,...,an∈{1,...,n}.
On the next line, there is a number q representing the number of mails to be sent. After that, there will be q integers x1,...,xq indicating the destination room number of each mail.
Note that for simplicity, we assume the postman always starts from the root regardless of the room he had just visited.
4
2 1 4 3
3
1 2 3
6
6 5 4 3 2 1
1
1
题解:精灵族住在一颗倒着的二叉树上,这棵二叉树是从东到西编号,最东边是1,依次类推,邮递员要给精灵送信,每次邮递员都在最底下的点上,让输出邮递员的路径,思想就是建一颗倒着的二叉树,如果编号小就在东边建,也就是右边,大了就建在左边,每次建图直接把路径存上就妥了;
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define mem(x,y) memset(x,y,sizeof(x))
const int MAXN=1010;
vector<char>path[MAXN];
struct Node{
Node *L,*R;
int nu;
Node(int x=0):nu(x){
L=NULL;R=NULL;
}
}*rot;
void inst(int x){
Node *p=rot;
while(1){
if(x>p->nu){
path[x].push_back('W');
if(p->L==NULL){
p->L=new Node(x);
break;
}
else p=p->L;
}
else{
path[x].push_back('E');
if(p->R==NULL){
p->R=new Node(x);
break;
}
else p=p->R;
}
}
}
int main(){
int T,n,q;
scanf("%d",&T);
while(T--){
for(int i=0;i<MAXN;i++)path[i].clear();
scanf("%d",&n);
int x;
scanf("%d",&x);
rot=new Node(x);
for(int i=1;i<n;i++){
scanf("%d",&x);
inst(x);
}
scanf("%d",&q);
while(q--){
scanf("%d",&x);
for(int i=0;i<path[x].size();i++)
printf("%c",path[x][i]);
puts("");
}
}
return 0;
}
java:注意java的对象传递是引用类型, 但是tree = new Tree()会给tree重新分配一个jvm地址,这时候tree的改变不会使原值改变,此时变成了值传递,所以想了个思路,就是在类里面对属性复制,也就是newL(),newR()方法;
代码:
package com.lanqiao.week1; import java.util.LinkedList;
import java.util.Scanner; public class hdu5444 {
private static Scanner cin = null;
static{
cin = new Scanner(System.in);
}
static class Tree{
public Tree l;
public Tree r;
public int value; public void newL(int v){
l = new Tree(null, null, v);
} public void newR(int v){
r = new Tree(null, null, v);
}
public static void insert(Tree t, int v){
if(v > t.value){
if(t.r != null)
insert(t.r, v);
else
t.newR(v);
}else{
if(t.l != null)
insert(t.l, v);
else
t.newL(v);
}
}
public static void visit(Tree t, int v){
if(t == null)
return;
if(v == t.value){
return;
}
if(v > t.value){
System.out.print("W");
visit(t.r, v);
}else{
System.out.print("E");
visit(t.l, v);
}
}
public Tree() {
super();
}
public Tree(Tree l, Tree r, int value) {
this.l = l;
this.r = r;
this.value = value;
}
}
public static void main(String[] args) {
int T, n, q, a, v;
T = cin.nextInt();
while(T-- > 0){
n = cin.nextInt();
a = cin.nextInt();
Tree t = new Tree(null, null, a); for(int i = 1; i < n; i++){
a = cin.nextInt();
Tree.insert(t, a);
}
q = cin.nextInt();
//System.out.println(t);
while(q-- > 0){
v = cin.nextInt();
Tree.visit(t, v);
System.out.println();
}
}
}
}
Elven Postman(二叉树)的更多相关文章
- hdu 5444 Elven Postman 二叉树
Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Problem Descrip ...
- hdu 5444 Elven Postman(二叉树)——2015 ACM/ICPC Asia Regional Changchun Online
Problem Description Elves are very peculiar creatures. As we all know, they can live for a very long ...
- (二叉树)Elven Postman -- HDU -- 54444(2015 ACM/ICPC Asia Regional Changchun Online)
http://acm.hdu.edu.cn/showproblem.php?pid=5444 Elven Postman Time Limit: 1500/1000 MS (Java/Others) ...
- hdu 5444 Elven Postman
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5444 Elven Postman Description Elves are very peculia ...
- 2015 ACM/ICPC Asia Regional Changchun Online HDU 5444 Elven Postman【二叉排序树的建树和遍历查找】
Elven Postman Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- hdu 5444 Elven Postman(长春网路赛——平衡二叉树遍历)
题目链接:pid=5444http://">http://acm.hdu.edu.cn/showproblem.php?pid=5444 Elven Postman Time Limi ...
- Elven Postman(BST )
Elven Postman Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- Hdu 5444 Elven Postman dfs
Elven Postman Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...
- HDU 5444 Elven Postman (2015 ACM/ICPC Asia Regional Changchun Online)
Elven Postman Elves are very peculiar creatures. As we all know, they can live for a very long time ...
随机推荐
- 基于Visual C++2013拆解世界五百强面试题--题6-double类型逆序
请设计一个函数,不许用到字符串函数,用数学运算,将double类型数据转换,例如123.456转换成654.321 首先想到依次提取他的每一个位数,然后进行运算,移动每一位数到相应位置,结果相加就能逆 ...
- Android 进程和线程模型
Android进程模型 在安装Android应用程序的时候,Android会为每个程序分配一个Linux用户ID,并设置相应的权限,这样其它应用程序就不能访问此应用程序所拥有的数据和资源了. 在 Li ...
- ASP.NET上传文件的三种基本方法
ASP.NET依托.net framework类库,封装了大量的功能,使得上传文件非常简单,主要有以下三种基本方法. 方法一:用Web控件FileUpload,上传到网站根目录. Test.aspx关 ...
- Android学习之Drawable(一)
Drawable有很多种,它们表示一种图像概念,但它们不全是图片.Drawable是什么呢?下面是Google Android API中的定义: A Drawable is a general abs ...
- FreeCodecamp:Repeat a string repeat a string
要求: 重要的事情说3遍! 重复一个指定的字符串 num次,如果num是一个负数则返回一个空字符串. 结果: repeat("*", 3) 应该返回"***". ...
- BZOJ 4143 The Lawyer
这道题看起来很吓人,但事实上看懂后会发现,其根本没有任何技术含量,做这道题其实要考虑的就是每天最早结束的一场的结束时间以及最晚开始的一场的开始时间,如果结束时间早于开始时间,那么OK就这 ...
- JavaScript 导学推荐
基本开始js学习的时候,可能会觉得很混乱,一开始都是从一些简单的表单验证还有拷贝别人效果代码,然后再慢慢去深入了解.我是觉得js是需要一定语言编程基础,我是觉得随着深入,JS的里面实在不算太好理解,个 ...
- 一、Linux启动过程详解
启动第一步--加载BIOS当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬盘 ...
- awk参数详解
wk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息 awk处理过程: 依次对每一行进行处理,然后输出 awk命令形式: awk [-F| ...
- cocos2d-x 通过JNI实现c/c++和Android的java层函数互调
文章摘要: 本文主要实现两个功能: (1)通过Android sdk的API得到应用程序的包名(PackageName),然后传递给c++层函数. (2)通过c++函数调用Android的java层函 ...