UVa 712 S树

题意:有一棵完全二叉树,每层元素有同一变量表示,从上到下分别为x1,x2,... 最后一层叶子结点会有0或1的赋值,输入给出。然后如果xi取值为0时,则往左子树走,否则往右子树走,直到走到叶子结点,得到一值。

思路:因为是完全二叉树,可以用顺序存储,数组实现即可。另外也只需存叶子结点的值就行了。对一结点k来说,左孩子是2k,右孩子是2k+1。因为高度最大为7,最多有x7,所以可以直接取数组的第二位,即下标1,来获得xk中的k。

注意:每个测试样例后有个空行,WA了一次~

二维数组作形参: 一是 char (*pt)[4] ; 二是 char pt[][5]  如果写成char *pt[5] 就会提示错误:cannot convert `char (*)[5]‘ to `char**‘ for argument `3‘ to `void process(char*, int, char**)‘  意思是实参是char(*)[5],而形参是char**,不匹配。

[ ]的优先级高于*,char (*pt)[4] 表示一个指向数组的指针,指向具有4个char值的数组的指针;char *pt[5] 表示指针数组,char型指针数组、有5个元素。

Code:

#include<stdio.h>
#include<string.h>
#define MAXN 200

void process(char *vva,int len,char varord[][5]);

int tree[MAXN];

int main()
{
 int cnt=1;
 int n;
 while(scanf("%d",&n)==1 && n)
 {
  char varord[8][5];
  for(int i=0;i<n;++i)
   scanf("%s",varord[i]);
  getchar();
  for(int i=0;i<(1<<n);++i)
  {
   char c=getchar();//printf("%c ",c);
   tree[(1<<n)+i]=c-'0';
  }
  //for(int i=0;i<(1<<n);++i)
  // printf("%d ",tree[i+(1<<n)]);
  int m;
  scanf("%d",&m);
  printf("S-Tree #%d:\n",cnt++);
  for(int i=0;i<m;++i)
  {
   char vva[10];
   scanf("%s",vva);
   process(vva,strlen(vva),varord);
  }
  printf("\n\n");
 }
 return 0;
}

void process(char *vva,int len,char varord[][5])
{
 int k=1;
 for(int i=0;i<len;++i)
 {
  int t=varord[i][1]-'0';//因最多是x7,所以这里可以直接减字符0。注意下标是1不是2.
  if(vva[t-1]=='0') k=2*k;
  else k=2*k+1;
 }
 printf("%d",tree[k]);
}
时间: 2024-12-23 12:07:08

UVa 712 S树的相关文章

uva 11992 线段树对矩阵进行更新查询

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3143 把矩阵变成一行,然后计算位置,lrj给了线段树数组做法 但是我做的线段树空间过大,直接爆掉,所以换方法了 主要还是测试自己的线段树区间更新的模板 各种RE+WA之后AC,,,,, 做的时候出现的几个错误: 1.行和列弄错 2.build初始化的时候,mmin mmax 都初始化为0才对

UVA 712(二叉树模拟)

L - S-Trees Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Appoint description:  System Crawler  (2014-04-01) Description  S-Trees  A Strange Tree (S-tree) over the variable set  is a binary tree representing a B

S-Tree (UVa 712) 二叉树

题目:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=839&page=show_problem&problem=653 思路:当前结点为k,左走则 2k,右走则 2k + 1,得到最后的点,减去前面n层的所有结点,得到的下标对应的0或1就是答案. /* S-Tree (UVa 712) */ #include <iostream> #include &

UVA 11525 Permutation(树状数组)

题目意思是说  给你一个数k  然后有k个si   问你1--k 的第n个全排列是多少   注意是 1 2 3...k的全排列 不是si的 N=   由观察得知(k-i)!就是k-i个数字的全排列种数, 0=<Si<=k-i,所以显然可知假设当i==1时从第(k-1)!*s1到第n个全排列都是由第S1+1个数字开始的数列,因为每(k-1)!次排列过后,下一个排列的第1个数字都要增大1(每隔(k-1)!次,这k-1个数字都排列过一遍了,下一次只能增大更前面一个,也就是第1个了) 比如对于数列{1

uva 12299 线段树 点相关的操作模板

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=502&page=show_problem&problem=3720 唯一值得一说的就是shift,变成更新点就行 这道题主要是测试下我做的算法模板 先贴模板 /**************************************************************** 2014.4 By Pilgr

UVA - 712 S-Trees(S树)

题意:0往左走,1往右走,已知所有叶子的值,每个查询都是根结点到叶子结点的路径,路径的每一个点分别对应着x1,x2,x3--但是实际上的S树的路径可能并非是x1,x2,x3-- 分析:先存路径变量的顺序,来控制最后访问的顺序. #pragma comment(linker, "/STACK:102400000, 102400000") #include<cstdio> #include<cstring> #include<cstdlib> #incl

uva 11354 - Bond(树链剖分)

题目链接:uva 11354 - Bond 题目大意:给定一张图,每次询问两个节点路径上进过边的危险值的最大值的最小值. 解题思路:首先建立最小生成数,然后根据这棵树做树链剖分. #include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; const int maxn = 50005; const int INF = 0x3f

UVa 806 四分树

题意: 分析: 类似UVa 297, 模拟四分树四分的过程, 就是记录一个左上角, 记录宽度wideth, 然后每次w/2这样递归下去. 注意全黑是输出0, 不是输出1234. 1 #include <bits/stdc++.h> 2 using namespace std; 3 // 1 2 4 // 3 4 5 const int base5[8] = {1,5,25,125,625,3125,15625,78125}; 6 int n; 7 string G[70]; 8 vector&

UVA - 11488 字典树

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2483 题意:给定一堆由0,1组成的串,现在要求一个最大值,值的结果为:串前缀*用于此前缀的字符串个数 思路:字典树,在插入字符串的时候就开始统计,对于插入的每个字符串的前缀的值都累加,然后一边插入一边维护最大值即可. #define _CRT_SECURE_NO_DEPRECAT