每天坚持做算法题,熟悉基本的套路,巩固语言基础,总结经验记下所学所想。
2018-3-20
P60近似计算
1 |
|
P62阶乘之和
要计算只包含加法、减法和乘法的整数表达式除以正整数n的余数,可以在
每步计算之后对n取余,结果不变。
1 |
|
P94键盘输入
1 | string s = "`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./"; |
2018-3-21
P140刽子手
关键在于设立win和lose以及bad的标志位,没猜一个更新标志位
1 |
|
P145信息编码
使用char code[n][1<<n]存放编码本,n。前面的n表示二进制长度,后面的表示该二进制数的十进制表示
1 |
|
2018-3-24
北邮OJ-11网研第三题-中序遍历树
题目描述
给一棵树,你可以把其中任意一个节点作为根节点。每个节点都有一个小写字母,中序遍历,得到一个字符串,求所有能得到的字符串的字典序最小串。因为这棵树不一定是二叉树,所以中序遍历时,先中序遍历以节点序号最小的节点为根的子树,然后再遍历根节点,最后根据节点序号从小到大依次中序遍历剩下的子树。
HINT
意思就是请枚举所有的点为根,然后中序遍历
最后输出所有结果中字典序最小的
比如说第二组数据
以0为根时结果为 bacd
以1为根时结果为 cadb
以2为根时结果为 badc
以3为根时结果为 bacd
所以字典序最小的是bacd
输入格式
多组数据,以EOF结束。
第一行一个数n(0< n < =100),表示树的节点的个数,节点从0开始。
然后一个长度为n的串,第i(0< = i < n)个字符表示节点i的字符。
接下来n-1行,每行两个数a,b,(0< = a,b < n),表示a和b之间有一条无向边。
输出格式
题中要求的最小的字符串
输入样例
3
bac
0 1
1 2
4
abcd
0 1
0 2
0 3
输出样例
bac
bacd
代码
1 |
|
2018-3-25
P186反片语
HINT
这里的map用于统计字符串的数量,如果出现两次则不输出。注意此时的key应该是标准化的。
代码
1 |
|
p189集合栈
HINT
使用vector存放集合,并把其和其在vector中的下标映射成map(因为ID是唯一的,避免每次查找vector使用map),stack中只需要存ID
代码
1 |
|
P195 丑数
HINT
priority_queue
代码
1 | const int coef[3] = {2,3,5};// x为丑数,他的2,3,5倍均为丑数 |
2018-3-26
P205 UNIX命令
HINT
总数是定长的,每个是不定长的字符串,所以采用string a[max]的数据结构
代码
1 | const int MAX = 100; |
P212 城市正视图
HINT
离散化,不能遍历所有x坐标,只遍历建筑物可能出现区间内的一点即可
代码
1 | const int maxn = 100 + 5; |
建筑物正视图拓展
题目
假设平面内有n个矩形,并输入n个矩形的左下角和右上角的坐标,求矩形重叠的最大次数。
HINT
离散化,离散化出所有x和y坐标构成的点,在所有的点处作判断
代码
1 | // |
2018-3-27
P225铁轨
HINT
使用栈存储中间,明确每次操作的流程
代码
1 | const int MAXN = 1000 + 10; |
P226矩阵乘法
HINT
读到右括号出栈两个字母并做一次判断
代码
1 | struct Matrix { |
P229 破损键盘
代码
1 | int main(){ |
2018-3-28
P231 移动盒子
HINT
list的学习与使用
代码
1 | int main(){ |
P236 小球下落
HINT
序号为k的小球左节点为2k+1,右节点为2k+2。如果树的节点之间建立了连接,则保存树节点的数组可以是无序的,一般的,都会遵从最开始的这个规则,即2k+1。。。这样的话,数 组保存的元素就是节点的数据,如此题使用bool amaxn).
代码
1 | const int maxn = 20; |
2018-3-29
P249 天平
HINT
递归输入
代码
1 | bool solve(int& W){ |
2018-3-30
P251 下落的树叶
HINT
递归输入
代码
1 | //输入并统计一棵子树,树根水平位置为p |
2018-04-01
P253四分树
HINT
首先建树,然后为每一个可能的位置设置map二维矩阵,转化为染色问题
代码
1 |
|
2018-04-02
P268 看图写树
HINT
不用建树,采用DFS输出
代码
1 |
|
2018-04-03
P270 雕塑
给出一些边平行于坐标轴的长方体,这些长方体可能相交,也可能相互嵌套,这些长方体形成了一个雕塑,求这个雕塑的总体积和表面积。(本题用到离散化,是5.2 5.3的拓展)
HINT
最容易想到直接进行bfs或者dfs统计,但此题的麻烦之处在于求整个雕塑的外表面积和雕塑内部可能出现四个长方体所搭成的空心,空心不能计算到表面积中,但是计算总体积却要计入,于是直接bfs或者dfs不好处理,于是,可以想到直接统计整个雕塑外围的所有小方块,即可很方便地求出雕塑地表面积和体积(雕塑地总体积==整个空间地体积-外围想方块的体积),还有一点就是由于坐标范围达到1-1000, 整个空间的大小达到了100010001000 = 1e9, 直接bfs明显会超时,由于长方体的个数最大只有50个,于是可以对原坐标进行离散化,把每一维的坐标离散化后,整个空间的大小缩小到了100*100*100 = 1e6,于是这个问题就解决了。(详细参考代码,注释地很详细)。
代码1
1 |
|
代码2
1 |
|
2018-4-4
理想路径
P273
HINT
- 若不考虑字典序问题,则显然可以直接bfs求解最短路。但是如何使得字典序最小呢?
- 显然要贪心选取每一步的col值最小,为了保证贪心选取时每一步都仍为最短路,从终点进行一次bfs的到各点dis。
- 取最小值的过程仍为bfs的过程,但是需要从多点出发访问下一层的bfs,用vector来实现,且访问层数即为最短距离。
代码
1 |
|
2018-04-09
P278 平衡的括号
HINT
使用栈
代码
1 | map<char, char> mp = {{'[', ']'}, {'(', ')'}}; |
P279 骑士的移动
HINT
广度优先遍历
代码
1 |
|
P280 巡逻机器人
HINT
bfs
代码
1 |
|
P280修改天平
HINT
本题利用dfs解决,不过思维上要发挥一些创造性。本题问至少要修改的砝码个数,那么首先可以想到要选一个基准砝码,其他所有的砝码都试图根据这个基准法吗而改变。不过本题的巧妙之处就在这里,只要以深度为depth(depth从0开始)重量为w的砝码为基准,那么就能求出整个天平的总重量,即w*2^(depth),在代码中可以简洁地表示为w<<depth。这样,我们只用统计每个可能的总重量对应了多少不需要改动的砝码,设一共有sum个砝码,总重量为sumw的天平对应的砝码个数是base[sumw],那么最终答案就是sum-max{base[i]}(i为所有可能的天平总重量)。本题在统计之前需要用dfs后序遍历该表达式。
本题的解法有点类似于找每个元素的某个贡献值的大小(在本题中贡献值就是以它为基准算出的天平总重量),同时统计该贡献值下元素有几个,那么最后取最优值即可。这种思维也是竞赛中的常见思维,应予以重视。
代码
1 |
|
2018-04-12
八皇后问题
HINT
回溯
代码
1 | void search(int cur) { |
2018-04-13
P369 煎饼
HINT
贪心
代码
1 | /** 翻转 */ |