Timus #1650. Billionaires

题目:有n个富豪(数据包含:姓名,开始时的所在地,拥有财富),某地财富即为在此的所有富豪财富相加。在接下来的m天,会有k个土豪在某一天晚上离开所在地,在第二天早上到达所在地。求每天拥有财富最多的城市,按照字母表顺序输出某城市财富最多的天数。ps:若某一天有两个及以上的城市财富相同则该天不算在这几个城市的天数中,若最终有城市天数为0则不输出此城市。

解析:该题目逻辑很简单,建立Person和City结构体,Person储存姓名,所在地,财富;City储存城市名,拥有财富。循环查找/插入/删除/更新City和Person中的数据,并找到City中财富最大的城市。

代码分析:你必须建立map或set容器或写自己的Tree结构来完成此题,否则必会超时。比如,如果你用顺序的方式遍历City中最大的城市/城市名必定会超时。
1. 我的解决方法是用map<string, City*>cityptr;用指针快速修改和查找。
2. 更加快捷的方式是map<string, pair<City*, long long>>Person;
3. 傻一点的方法是建立map<string, int>index;这种方法缺点是每次都要更新index。

Timus #1628. White Streaks

题目:有m*n的矩形,每个方块默认为白色,现给k个方块图上黑色,问有多少连续的num*1或1*num的长方形。如果一个1*1的方块周围没有白色方块,那么这个方块也包含在答案里面。

解析:行列遍历。对行和列分别进行查找,对行和列查找过程中单独成一个方块的坐标分别记录在两个集合中,最终只需要在结果上加上两个集合的交集中元素的个数。

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代码

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