刘汝佳 算法竞赛-入门经典 第二部分 算法篇 第六章 2(Binary Trees)
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(String)
第一题:401 - Palindromes UVA : http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8 ...
- 刘汝佳 算法竞赛-入门经典 第二部分 算法篇 第五章 3(Sorting/Searching)
第一题:340 - Master-Mind Hints UVA:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Item ...
- 刘汝佳 算法竞赛-入门经典 第二部分 算法篇 第五章 2(Big Number)
这里的高精度都是要去掉前导0的, 第一题:424 - Integer Inquiry UVA:http://uva.onlinejudge.org/index.php?option=com_onlin ...
- 刘汝佳 算法竞赛-入门经典 第二部分 算法篇 第六章 1(Lists)
127 - "Accordian" Patience 题目大意:一个人一张张发牌,如果这张牌与这张牌前面的一张或者前面的第三张(后面称之为一位置和三位置)的点数或花式相同,则将这张 ...
- 算法竞赛入门经典第二版 TeX中的引号 P47
#include<bits/stdc++.h> using namespace std; int main(){ ; while( (c = getchar()) !=EOF) //get ...
- 算法竞赛入门经典第二版 蛇形填数 P40
#include<bits/stdc++.h> using namespace std; #define maxn 20 int a[maxn][maxn]; int main(){ ; ...
- 算法竞赛入门经典第二版 竖式问题 P42
#include<bits/stdc++.h> using namespace std; int inset(char *s,int num) { //判断数字是否在数字集中 int le ...
- 算法竞赛入门经典第二版 回文词P49
#include<bits/stdc++.h> using namespace std; char rev[]="A 3 HIL JM O 2TUVWXY51SE Z 8 &qu ...
- 算法竞赛入门经典第二版第二章习题-(练习Java和C++语法)
习题2-1水仙花数(daffodil) 输出1000-999中所有的水仙花数.若三位数ABC满足ABC = A3+B3+C3,则称其为水仙花数. Java: package suanfa; publi ...
随机推荐
- Intellij使用"easyexplore"
刚开始接触Intellij,里面有很多东西还不太会用,平时在eclipse里面用的很方便的easyexplore能帮助快速打开文件目录,Intellij中本身就有这样的功能,只是默认没有开启,需要我们 ...
- Svn中的tag标签的用法和意义
使用场景: 假如你的项目的某个版本已经完成测试开发.测试并已经上线,接下来街道新的需求,新项目开发需要修改多个文件的代码,当需求已经开发一段时间的时候,突然接到用户和测试人员的反馈,项目中某个重大的b ...
- strlen() 和 sizeof() 的区别
1.strlen() 时函数,他在程序运行时才能计算.它的参数类型要求时 char *,且必须是以'/0'结尾.数组在传入时已经退化为指针.它的作用是返回数组中字符串的长度. 2.sizeof()时运 ...
- Python中的self(Python笔记)
self Python中类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候你不为这个参数赋值,Python会提供这个值.这个特别的变量指对象本身,按 ...
- js确认框confirm()用法实例详解
先为大家介绍javascript确认框的三种使用方法,具体内容如下 第一种方法:挺好用的,确认以后才能打开下载地址页面.原理也比较清晰.主要用于删除单条信息确认. ? 1 2 3 4 5 6 7 8 ...
- Goldengate进程的合并与拆分规范
Goldengate抽取进程的合并与拆分原则 1. 文档综述 1.1. 文档说明 本文档描述了对GoldenGate的抽取进程进行拆分和合并的基本原则和详细步骤. 1.2. 读者范围 本文 ...
- CentOS7-1810 系统Samba配置说明
Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件.SMB(Server Messages Block,信息服务块)通信协议是微软(Microsoft)和英特尔(Intel)在198 ...
- Python学习笔记(1)--Windows基本环境搭建
1.安装Python 官网下载地址:https://www.python.org/downloads/ 下载完成后安装选择自定义安装,并勾选自动填写环境变量,如果是默认安装,还需要自己手动配置环境变量 ...
- 【SRM 717 div2 B】LexmaxReplace
Problem Statement Alice has a string s of lowercase letters. The string is written on a wall. Alice ...
- [Recompose] Stream Props to React Children with RxJS
You can decouple the parent stream Component from the mapped React Component by using props.children ...