Timus #1067. Disk Tree

题目:输入N个文件/文件夹位置关系,输出层级关系。看题目例子就可以看懂。

解析:利用树状结构

代码缺点:该代码内存占用太多。在insert函数中,可以选择更高效的查找及插入算法,但这道题对运行时间要求没那没高,可以写的相对简单一点。Tree* child[70]这个数字70根据题目可以调整,只是越大消耗内存越大,可以存放的子节点越多,Timus这道题写70就够了。

代码优化建议:
1. 把Tree中改成vector<pair<string, Tree>> child;这样可以大大减少内存以及提供更高效的对string排序操作。
2. 把Tree中改成set<Tree> child;并对<运算符(根据string name;)进行重载。set提供了高效的insert和find函数,这种方法更高效。

Timus #1494. Monobilliards

题目:有n个数按照1,2,3…n的顺序入栈,在每一步入栈的过程中(严格按照入栈顺序,即从先到后),可以按顺序出栈(严格按照出栈顺序,即从后到先),如果可以得到题目所input的顺序,则输出not a proof,否则为cheater。

例子讲解:
input:
4
1 3 2 4
output:
not a proof

题目为1,2,3,4入栈顺序
(1). 1入栈,1出栈;
(2). 2,3入栈,3,2出栈;
(3). 4入栈,4出栈
存在这种可能,输出not a proof

input:
3
3 1 2
output:
cheater

题目为1,2,3入栈顺序
(1). 1,2,3入栈,3 出栈
因为接下来出栈必须为2,所以不存在这种可能,输出cheater

解析: 堆栈

Using the idea of stack. Input numbers (by order 1,2,3,…,n) to stack one by one, remove it out of the stack (by input number’s order) in each insertion. See if the stack is empty in the end.

Timus #1521. War Games 2

题目:约塞夫问题。n个人排成一个圆圈开始报数,报数到k的人出列,输出该人在原队列的位置。

解析:
1. 直接for循环,利用vector和简单的数学计算
2. 线段树解约塞夫环

代码:
1. vector

2. 线段树解约塞夫环

CSDN代码

Timus #1726

题目:有n个人相互访问访问各自的坐标,所有道路正交,沿直线行走,求平均路程。

解析:首先对x,y分别进行排序。每个x[i + 1] – x[i] 会经过 (i + 1) * (n – (i + 1)) * 2次,y也一样,然后进入循环进行计算。

代码及精度问题:使用long long int,不要使用int,在测试样例中会超出int范围。计算过程中加入long long temp;避免在计算过程中强制类型转换造成计算错误。

Timus #1322

题目:Burrows-Wheeler逆变换,具体读题即可读懂

解析:Burrows-Wheeler 压缩(转换)算法(BWT)。

1. 百度百科上的例子:加列,排序循环

2.我也不知道什么原理,我用的是这种方法。vector of inverse transform.

浙ICP备2021019730-1    浙公网安备 33010902002953号
Copyright © 2024 PanCake