112 - Tree Summing

   题目大意:给出一个数,再给一颗树,每个头节点的子树被包含在头节点之后的括号里,寻找是否有从头节点到叶子的和与给出的数相等,如果有则输出yes,没有输出no!

  解题思路:按照括号匹配的原则,调用栈,求从头节点到叶子节点的和!

  解题代码:

 //Author    :Freetion
//file :112 - Tree Summing #include <stdio.h>
#include <iostream>
#include <stack>
#include <string.h>
using namespace std; #define Local
int main()
{
#ifdef Local
freopen ("data.in", "r", stdin);
freopen ("data.out", "w", stdout);
#endif
stack <char> bracket;
int num[];
int mat, cun, wei, sum;
bool flag = false, zh = true;
while (~scanf ("%d", &mat))
{
flag = false;
char ch;
cun = sum = wei = ;
while (!bracket.empty())
bracket.pop();
while (cin >> ch)
{
if (ch == '(')
{
wei = ;
zh = true;
bracket.push(ch);
}
else if (ch == ')')
{
wei = ;
zh = true;
bracket.pop();
if (bracket.size() == cun)
{
for (int i = ; i <= cun; i ++)
sum += num[i];
if (sum == mat)
flag = true;
else sum = ;
}
if (bracket.empty())
break;
}
else
{
if (ch == '-')
zh = false;
else if(wei)
{
if (!zh)
num[cun] = -num[cun];
num[cun] = *num[cun] + ch - '';
if (!zh)
num[cun] = -num[cun];
}
else
{ cun = bracket.size() - ;
num[cun] = ch - '';
wei ++;
if (!zh)
num[cun] = -num[cun];
} }
}
if (flag)
printf ("yes\n");
else printf ("no\n");
}
return ;
}

548 - Tree

  题目大意:给出一颗二叉树的中序遍历和后序遍历,求从头节点到叶子节点的最小和,并且将获得该最小和的路径的叶子节点的值输出。

  解题思路:根据中序遍历和后序遍历递归建树,找到最小和,并保存该路径的叶子节点的值!

  解题代码:

 //Author    :Freetion
//file :548 - Tree ¸ù¾Ý¶þ²æÊ÷ÖÐÐò±éÀú½á¹ûÓëºóÐò±éÀú½á¹ûÖع¹¶þ²æÊ÷ #include <stdio.h>
#include <string.h>
#include <iostream>
#include <sstream>
using namespace std; //#define Local struct node
{
int min_sum;
int min_leaf;
}Min; void find_minsum(const int& mid, int len_mid, const int& back, int len_back, int sum)
{
if (len_back == )
{
// cout << " ( ) ";
return ;
}
if (len_back == )
{
sum += *(&back);
if (sum < Min.min_sum)
{
Min.min_sum = sum;
Min.min_leaf = *(&back);
}
else if (sum == Min.min_sum)
{
if (back < Min.min_leaf)
Min.min_leaf = *(&back);
}
// cout << " ( " << *(&back)<< " ) ";
return ;
}
int k = -;
for (int i = ; i < len_mid; i ++)
if (*(&mid+i) == *(&back+(len_back-)))
{
k = i;
break;
}
sum += *(&back+(len_back-));
// cout << " ( " << *(&back+(len_back-1));
find_minsum(*(&mid), k, *(&back), k, sum); find_minsum(*(&mid+k+), len_mid-k-, *(&back + k), len_mid-k-, sum);
// cout << " ) ";
} int main()
{
#ifdef Local
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif
int mid[], back[];
string tmp;
int cun_mid, cun_back;
string str;
while (getline(cin, str))
{
Min.min_sum = 0x3fffffff;
cun_mid = cun_back = ; istringstream in(str);
while (in >> tmp)
{
int len = tmp.size();
mid[cun_mid] = ;
for (int i = ; i < len; i ++)
{
mid[cun_mid] = * mid[cun_mid] + tmp[i] - '';
}
cun_mid ++;
} getline(cin, str);
istringstream input(str);
while (input >> tmp)
{
int len = tmp.size();
back[cun_back] = ;
for (int i = ; i < len; i ++)
{
back[cun_back] = * back[cun_back] + tmp[i] - '';
}
cun_back ++;
} find_minsum(*mid, cun_mid, *back, cun_back, );
// cout << endl;
cout << Min.min_leaf << endl;
}
}

297 - Quadtrees

  解题思路:递归建树,寻找黑节点,找到后将该节点所占像素累加起来,最后输出!

  解题代码:

 //Author    :Freetion
//file :297 - Quadtrees #include <stdio.h>
#include <string>
#include <iostream>
using namespace std; struct TREE
{
bool black;
struct TREE *leaf[];
}tree;
TREE *root1, *root2;
char *q;
int sum; TREE* build_tree()
{
TREE *root = new TREE;
root -> black = ;
if(*q == 'p')
{
for (int i = ; i < ; i ++)
{
q ++;
root -> leaf[i] = build_tree();
}
}
else
{
if (*q == 'f')
root -> black = ;
for (int i = ; i < ; i ++)
root -> leaf[i] = NULL;
}
return root;
} void print(TREE *root)
{
if (root == NULL)
return;
printf ("(%d", root -> black);
for (int i = ; i < ; i ++)
print (root -> leaf[i]);
printf (")");
return ;
} void DFS(TREE *root1, TREE *root2, int cen)//cen代表深度
{
if (root1 == NULL && root2 == NULL)
return ;
if (root1 == NULL)
{
if (root2 -> black)
{
sum += ( << ( - *cen));
return;
}
for (int i = ; i < ; i ++)
DFS(root1, root2 -> leaf[i], cen + );
return ;
}
if (root2 == NULL)
{
if (root1 -> black)
{
sum += ( << ( - *cen));
return ;
}
for (int i = ; i < ; i ++)
DFS(root1 -> leaf[i], root2, cen + );
return ;
}
if (root1 -> black || root2 -> black)
{
sum += ( << ( - *cen));
return ;
}
for (int i = ; i < ; i ++)
DFS (root1 -> leaf[i], root2 -> leaf[i], cen + );
} int main()
{
int T;
scanf ("%d", &T);
getchar();
string tre1, tre2, tresum;
while (T--)
{
sum = ;
getline(cin, tre1);
getline(cin, tre2);
q = &tre1[];
root1 = build_tree();
q = &tre2[];
root2 = build_tree();
/*
print (root1);
printf ("\n");
print (root2);
printf ("\n");
*/
DFS(root1, root2, );
printf ("There are %d black pixels.\n", sum);
}
}

712 - S-Trees

  此题Submission error先把代码放这。

 //Author    :Freetion
//file :712 - S-Trees #include <stdio.h>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std; const int max_p = ;
struct cen
{
string str;
int num;
bool operator < (const cen c) const
{
return str < c.str;
}
}; int main()
{
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
int leaf[max_p];
int n, cas = ;
cen ce[];
while (scanf ("%d", &n) == && n)
{
printf ("S-Tree #%d:\n", cas ++);
for (int i = ; i < n; i ++)
cin >> ce[i].str;
for (int i = ; i < *(n+); i ++)
scanf ("%1d", &leaf[i]);
int que;
scanf ("%d", &que);
while (que--)
{
for (int i = ; i < n; i ++)
scanf ("%1d", &ce[i].num);
sort (ce, ce+n);
int node = ;
for (int i = ; i < n; i ++)
{
if (ce[i].num)
node = *node + ;
else node = *node;
}
printf ("%d", leaf[node - (<<n)]);
}
printf ("\n\n");
}
}

699 - The Falling Leaves

  题目大意:给一颗树的先序遍历,-1代表空节点,那么给出的便是满二叉树,求从左到右竖直在一条直线的节点的和,并从左到有输出。子节点与父节点水平距离为1。

  解题思路:先把树存入,后按照节点位置累加和,运用map容器可运用负数作下标,怎很容易保存节点位置。

  解题代码:

 //Author    :Freetion
//file :699 - The Falling Leaves #include <stdio.h>
#include <iostream>
#include <string>
#include <map>
using namespace std; struct node
{
int num;
int pos;
node *left, *right;
};
int in;
int Min;
int Max;
map <int, int> stor;
node* build(int pos)
{
int x;
if (scanf ("%d", &x) == - || (x == - && in == ))
return NULL;
in ++;
node *root = new node;
if (x != -)
{
root -> pos = pos;
root -> num = x;
root -> left = build(pos - );
Min = (Min < pos - ) ? Min : pos - ;
root -> right = build(pos + );
Max = (Max > pos + ) ? Max : pos + ;
}
if (x == -)
{
root -> left = NULL;
root -> right = NULL;
}
return root;
} void fall_leaf(node *root)
{
if (root == NULL)
return;
if (root != NULL)
{
stor[root -> pos] += root -> num;
fall_leaf(root -> left);
fall_leaf(root -> right);
return;
}
} int main()
{
// freopen("data.in", "r", stdin);
// freopen("data.out", "w", stdout);
int cas = ;
while ()
{
Min = 0x3fffffff;
Max = -0x3fffffff;
in = ;
stor.clear();
node *root = build();
if (root == NULL)
break; fall_leaf(root);
printf ("Case %d:\n", cas ++);
for (int i = Min+; i < Max; i ++)
printf ("%d%c", stor[i], (i == Max-) ? '\n' : ' ');
printf ("\n");
} }

327 - Evaluating Simple C Expressions

  题目意思很显然。

  解题思路:直接模拟各种运算符结合的情况。

  解题代码:

 //Author    :Freetion
//file :327 - Evaluating Simple C Expressions #define Local
#include <iostream>
#include <stdio.h>
#include <string.h> int num[];
char ope[];
bool appear[]; void give_value()
{
memset(appear, , sizeof(appear));
for (int i = ; i <= 'z'; i ++)
num[i] = i - ;
return ;
} int solve()
{
int ans = ;
int add = , red = ;
int start = ;
int len = strlen(ope);
for (int i = ; i < len; i ++)
{
if (ope[i] == ' ')
continue;
if (ope[i] == '-')
{
red ++;
if (red == && add == && start)
{
int j = i;
while (ope[j] == ' ' || ope[j] == '-' || ope[j] == '+')
j --;
num[ope[j]] --;
red = ;
start = ;
}
}
else if (ope[i] == '+')
{
add ++;
if (red == && add == && start)
{
int j = i;
while (ope[j] == ' ' || ope[j] == '-' || ope[j] == '+')
j --;
num[ope[j]] ++;
add = ;
start = ;
}
}
else
{
start = ;
if (add == && red == )
{
num[ope[i]] --;
ans += num[ope[i]];
}
else if (add == && red == )
{
num[ope[i]] ++;
ans -= num[ope[i]];
}
else if (add == && red == )
ans -= num[ope[i]];
else if ((add == || add == )&& red == )
{
num[ope[i]] ++;
ans += num[ope[i]];
}
else if (add == && (red == || red == ))
{
num[ope[i]] --;
if (red == )
ans -= num[ope[i]];
else ans += num[ope[i]];
}
else
ans += num[ope[i]];
appear[ope[i]] = ;
add = red = ;
}
}
return ans;
} int main()
{
#ifdef Local
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif
while (gets(ope))
{
int ans;
give_value();
printf ("Expression: %s\n", ope);
ans = solve(); printf (" value = %d\n", ans);
for (int i = 'a'; i <= 'z'; i ++)
if (appear[i])
printf (" %c = %d\n", i, num[i]);
}
}

839 - Not so Mobile

  题目大意:给出一个杠杆,w1,d1,w2,d2,判断杠杆是否平衡,即w1*d1 == w2*d2;如果w1 为 0则说明,左边杠杆下还有杠杆,w2为0亦然。判断所有杠杆是否平衡。

  解题思路:按照输入直接递归判断。

  解题代码:

 //Author    :Freetion
//file :839 - Not so Mobile #include <stdio.h>
#include <math.h>
#include <string>
#include <iostream>
using namespace std; int w1, d1, w2, d2;
int flag; int DFS(int w1, int d1, int w2, int d2)
{
scanf ("%d%d%d%d", &w1, &d1, &w2, &d2);
if (w1 == )
w1 = DFS(w1, d1, w2, d2);
if (w2 == )
w2 = DFS(w1, d1, w2, d2);
if (w1*d1 != w2*d2)
flag = ;
return (w1 + w2);
} int main()
{
int T;
int w1, d1, w2, d2;
scanf ("%d", &T);
while (T--)
{
flag = ;
DFS(, , , );
if (flag)
printf ("YES\n");
else printf ("NO\n");
if (T)
puts("");
}
return ;
}

10562 - Undraw the Trees

  题意也很显然。

  解题代码:

 //Author    :Freetion
//file :10562 - Undraw the Trees
#define Local
#include <string>
#include <stdio.h>
#include <iostream>
using namespace std; string tree[];
int cun; void DFS(int D, int B)
{
int i;
for (i = B; i >= ; i --)
if (tree[D][i] != '-')
break;
for (i ++; i < tree[D].size() && tree[D][i] == '-'; i ++)
{
if (i >= tree[D+].size())
break;
if (tree[D+][i] != ' ' && tree[D+][i] != '#')
{
printf ("%c(", tree[D+][i]);
if (D+ < cun && tree[D+][i] == '|')
DFS(D+, i);
else printf(")");
}
}
printf (")");
return;
} int main()
{
#ifdef Local
freopen ("data.in", "r", stdin);
freopen ("data.out", "w", stdout);
#endif
int T;
tree[].clear();
for (int i = ; i < ; i ++)
tree[] += '-';
scanf ("%d", &T);
getchar();
while (T--)
{
cun = ;
while ()
{
getline(cin, tree[cun]);
if (tree[cun][] == '#')
break;
cun ++;
}
printf ("(");
DFS(, );
printf ("\n");
}
return ;
}

刘汝佳 算法竞赛-入门经典 第二部分 算法篇 第六章 2(Binary Trees)的更多相关文章

  1. 刘汝佳 算法竞赛-入门经典 第二部分 算法篇 第五章 1(String)

    第一题:401 - Palindromes UVA : http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8 ...

  2. 刘汝佳 算法竞赛-入门经典 第二部分 算法篇 第五章 3(Sorting/Searching)

    第一题:340 - Master-Mind Hints UVA:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Item ...

  3. 刘汝佳 算法竞赛-入门经典 第二部分 算法篇 第五章 2(Big Number)

    这里的高精度都是要去掉前导0的, 第一题:424 - Integer Inquiry UVA:http://uva.onlinejudge.org/index.php?option=com_onlin ...

  4. 刘汝佳 算法竞赛-入门经典 第二部分 算法篇 第六章 1(Lists)

    127 - "Accordian" Patience 题目大意:一个人一张张发牌,如果这张牌与这张牌前面的一张或者前面的第三张(后面称之为一位置和三位置)的点数或花式相同,则将这张 ...

  5. 算法竞赛入门经典第二版 TeX中的引号 P47

    #include<bits/stdc++.h> using namespace std; int main(){ ; while( (c = getchar()) !=EOF) //get ...

  6. 算法竞赛入门经典第二版 蛇形填数 P40

    #include<bits/stdc++.h> using namespace std; #define maxn 20 int a[maxn][maxn]; int main(){ ; ...

  7. 算法竞赛入门经典第二版 竖式问题 P42

    #include<bits/stdc++.h> using namespace std; int inset(char *s,int num) { //判断数字是否在数字集中 int le ...

  8. 算法竞赛入门经典第二版 回文词P49

    #include<bits/stdc++.h> using namespace std; char rev[]="A 3 HIL JM O 2TUVWXY51SE Z 8 &qu ...

  9. 算法竞赛入门经典第二版第二章习题-(练习Java和C++语法)

    习题2-1水仙花数(daffodil) 输出1000-999中所有的水仙花数.若三位数ABC满足ABC = A3+B3+C3,则称其为水仙花数. Java: package suanfa; publi ...

随机推荐

  1. CUDA笔记13

    在新的环境上用CUTIL的时候,出现了问题.无法解析的外部符号 __imp_cutCheckCmdLineFlag 问题描述: kernel.cu.obj : error LNK2019: 无法解析的 ...

  2. CentOS7-1810 系统Samba配置说明

    Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件.SMB(Server Messages Block,信息服务块)通信协议是微软(Microsoft)和英特尔(Intel)在198 ...

  3. python的模块导入机制

    在python中用import或者from...import来导入相应的模块. 模块(Module)其实就是一些函数和类的集合文件,它能实现一些相应的功能,当我们需要使用这些功能的时候,直接把相应的模 ...

  4. TCP学习前的准备——可靠数据传输协议

    由于传输层所依赖的网络层是不可靠的,通过逐渐考虑实际情况不断引入新技术来实现可靠数据传输. 完全可信的信道 有比特差错的信道 新的协议功能: 1.    差错检测:检验和 2.    接收方反馈:序号 ...

  5. Generational GC (Part one )

    目录 什么是分代垃圾回收 对象对的年龄 新生代对象和老年对象 Ungar的分带垃圾回收 堆的结构 记录集 写入屏障 对象的结构 分配 新生代GC 幸存空间沾满了怎么办? 老年代GC 优缺点 吞吐量得到 ...

  6. 监控web服务(http,本地 / 远程监控nginx)

    监控 httpd 服务一: #!/bin/bash #描述: 秒级别监控 http 服务 while [ 1 -lt 2 ] do sleep 10 ai=`netstat -ntl | grep & ...

  7. 紫书 习题 10-7 UVa 10539(long long + 素数筛)

    注意要开long long 如果int * int会炸 那么久改成long long * int #include<cstdio> #include<vector> #incl ...

  8. python main函数

    关于Python的主(main)函数问题 2007-07-23 19:14 初次接触Python的人会很不习惯Python没有main主函数.这里简单的介绍一下,在Python中使用main函数的方法 ...

  9. struts2.x + Tiles2.x读取多个xml 配置文件

    在web.xml中配置如下即可: <context-param> <param-name>org.apache.tiles.impl.BasicTilesContainer.D ...

  10. iOS 卖票中多线程分析;

    注意:(主要一个加锁机制)