拿到题目看一下,大体思路还是比较清晰的,用一个数组来装所有的收集到的赠票。每当坐地铁的时候,就直接花钱,然后获得一张赠票,放到数组里面。每当坐公交的时候,看看数组里面有没有时间合适,价格小于现在公交票价的赠票,并且没用过的赠票,直接用时间最早的那一张就可以了。
每张赠票要存三个信息,因此用一个结构体来存。数据不超过10^5 ,因此开一个10^5 长度的数组。
我们想想极限情况什么样子,极限数据10^5 ,假设开始的时候全坐地铁,坐了5∗10^4 次以后,我们的盒子里面有好多票啊。后面全坐公交,要坐5∗10^4 次,每次都在这个大盒子里面找合适的票,复杂度O(n^2 ),总计算量2.5∗10^9。
怎么优化呢?关键点在于题中说每次坐车开始时间都不重合,而且45分钟票就过期。所以理论上来讲,盒子里最多也就有45张没过期的票。大量的票都是已经过期了的,没必要从头扫一遍数组,在大量过期的票中浪费宝贵的青春。所以我们想到类似手写队列的方法,定义一个head变量和一个tail变量,分别表示目前还没过期的第一张票的位置,和下一张新的赠票在数组里要插入的位置,每次从head到小于tail循环即可。每次最多循环45次,总共10^5 次循环,肯定不会超时。