这不叫躺平,这叫躺在K线上挨打。
攒了300万,按理说已经是很多打工人做梦都不敢想的安全垫了。结果一辞职,全职投资,还直接全仓ETH,亏到只剩120万,然后问还能不能不上班。兄弟,这问题问得挺扎心的。
最要命的不是亏了60%,是你把“投资”玩成了“押注”。全仓这俩字一出来,后面基本就没啥优雅可言了。涨的时候觉得自己悟了,跌的时候才发现自己其实是在裸奔。
真想不上班,那起码得算清楚房租、吃饭、家里开销、医保、未来几年现金流。别币价一抖,自己心态先崩。
不想上班我理解,谁想啊。但靠一个波动巨大的资产硬撑人生自由,这事听着就像把退休计划绑在过山车上。HR看完都沉默了,老板看完估计想发招聘链接。
车都在同一条路上,终点是 target,每辆车有自己的位置和速度。麻烦的地方不是算谁先到,而是后面的车追上前面的车以后,就不能超过了,只能跟着前面的车一起走。
这题第一眼别急着模拟。
模拟每一秒、每一米,基本就是把自己往坑里带。车队问题最关键的一句话是:离终点更近的车,决定了后面车能不能独立成队。
比如:
target = 12position = [10, 8, 0, 5, 3]speed = [2, 4, 1, 1, 3]位置 10 的车到终点需要:
(12 - 10) / 2 = 1位置 8 的车到终点也需要:
(12 - 8) / 4 = 1它刚好能追上前面的车,所以这两个算一个车队。
这里我一般会先把车按 position 从大到小排,也就是离终点近的放前面。然后从前往后扫一遍,维护一个 lastTime,表示前面那个车队到终点的时间。
如果当前车到终点的时间 t 小于等于 lastTime,说明它能在终点前追上前面的车队,不能单独算。
如果 t 大于 lastTime,说明它追不上前面那队,只能自己开成一个新车队。
Go 代码我会这么写,没必要搞一堆结构包装:
package mainimport"sort"type carNode struct { pos int speed int}funccarFleet(target int, position []int, speed []int)int { n := len(position) cars := make([]carNode, 0, n)for i := 0; i < n; i++ { cars = append(cars, carNode{ pos: position[i], speed: speed[i], }) } sort.Slice(cars, func(i, j int)bool {return cars[i].pos > cars[j].pos }) fleet := 0 lastArrive := -1.0for _, c := range cars { t := float64(target-c.pos) / float64(c.speed)if t > lastArrive { fleet++ lastArrive = t } }return fleet}这段代码里,真正有用的就两处。
第一处是排序:
cars[i].pos > cars[j].pos必须按离终点近到远排。你反过来排也能写,但判断会绕,写着写着就容易把“谁追谁”搞反。
第二处是这个判断:
if t > lastArrive注意是大于,不是大于等于。
当前车如果到达时间刚好等于前面车队的时间,说明它在终点位置追上了,也算同一个车队。这地方不少人会写成 >=,样例可能过,边界一来就炸。
这题其实不是速度题,是顺序题。
前面的车慢,后面的车再快也没用,追上以后只能降速跟着走。我们关心的不是每辆车最后速度是多少,而是它有没有资格成为一个新的“到达时间”。
排完序后,越往后扫,车的位置越靠后。它能不能单独成队,只看一件事:它到终点的理论时间,是否比前面车队更晚。
更晚,追不上,新车队。
不更晚,能追上,合并。
所以时间复杂度主要卡在排序,O(n log n)。后面那一趟扫描是 O(n)。空间上用了一个 cars 数组,O(n)。
这题别上来就写模拟,也别想着维护一堆追车过程。车队一旦形成,后面的细节都不用管了。到达时间往那一放,谁能追上,谁追不上,一眼就够了。
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……




还没有评论,来说两句吧...