使用AI编程完成“青海湖租车之旅”|豆包MarsCode AI刷题

2 阅读3分钟

青海湖租车之旅是AI刷题栏目中靠前的几个中等题,本身其实不太难,但是确实是给很久没写算法的我出了一道难题。刚拿到手时,我大概是想试试贪心,但是想想肯定也行不通,于是我干脆地尝试使用AI刷题功能试试水。

于是我试着问Marscode助手:

你对这道题的思路是什么?

他的回答总结如下:(不然有凑字数的嫌疑了)

  • 使用一个列表来存储加油站的信息,每个加油站包含两个信息:距离起点的距离和油价。
  • 使用一个队列(或栈)来维护当前可到达的加油站,并根据油价进行排序。 通过动态规划的思想,我们可以逐步计算出从起点到终点的最小燃油成本。关键在于合理选择加油站和加油量,确保在满足油箱容量和剩余油量限制的前提下,最小化总成本。

我在他的提示下先沿着这个方向想了想,但是很明显失败了,我最多只想到了优先队列的方法,让其进行排序,但是如何考虑加入顺序以更好地在遍历加油站时及时出队呢?

带着这个问题,我又问了Marscode

既考虑加入顺序又考虑大小的数据结构有什么?

MarsCode果断地回答我

在编程中,既考虑加入顺序又考虑大小的数据结构通常是单调队列(Monotonic Queue) 。单调队列是一种特殊的双端队列(Deque),它保持队列中的元素按照某种单调性(递增或递减)排列。

结果我就沿着这个方向做下去了(省略三万字),单调队列确实可以做,但是需要先将问题描述成线性规划,然后逐步递推,中间出了很多bug,最后耗费80行代码和大量特殊判断结束了这道题。

意犹未尽,最后在写完之后,我还是回过头来问了

如何让优先队列可以将某个属性不符合要求的队内元素快速弹出?

Marscode则回答

惰性删除

惰性删除是一种优化策略,它允许你在需要时才删除不符合要求的元素,而不是在每次插入或删除操作时都进行检查。具体步骤如下:

  1. 标记删除:当某个元素不符合要求时,将其标记为已删除,而不是立即从队列中移除。
  2. 惰性检查:在需要访问队列头部元素时,检查该元素是否已被标记为删除。如果是,则将其从队列中移除,并继续检查下一个元素,直到找到一个未被删除的元素。

这不就是Dijkstra算法里优先队列使用的方法么,我竟然没想到,咳咳。真是白费了大量时间复习了一次单调队列,还列了一堆方程(

当然,其实这就是因为我对LLM的使用不够熟练罢了,写的提示词并没有很好地表达我的想法,所以才会走了弯路。事实上,Marscode能够自动读入题面与代码,并且快速响应我的问题,也总比自己手粘要快,关键还得是学学提示工程。不说了,该学Langchain去了。