您有一辆卡车在圆形轨道上行驶,加油站在圆圈周围隔开。每个站都有一定数量的气体。卡车上的油箱很大。加油站之间的距离需要一定量的气体才能通过。您只能向一个方向移动。
使用什么算法?您从哪个加油站开始?您能一直走到起点站吗?
是的,O(n)是可能的。绝对不是TSP。
令x i是第i站的可用天然气量减去前往下一个站所需的天然气量。
要求是ΣX 我 ≥0(足够的气体以完成一整圈)。
考虑S i = x 1 + x 2 + … + x i
注意,S ñ ≥0。
现在选择最小的(或什至最大的),从而使k最小,并从其旁边的站开始,从而更容易为k编写代码。
现在对于k <Ĵ≤N,我们有气体在罐= S Ĵ - S ķ ≥0。
1个≤Ĵ≤K,我们有气体在罐= X K + 1 + … + X Ñ + X 1 + X 2 + … + X Ĵ = S ñ - S ķ + S Ĵ ≥0。
因此,从k + 1开始将确保在每个站都有足够的气体累积以到达下一个站。
// C++ code. gas[i] is the gas at station i, cost[i] is the cost from station i to (i+1)%n int circ(vector<int> &gas, vector<int> &cost) { int min_S=INT_MAX, S=0, position=0; for(int i=0;i<gas.size();i++) { S += gas[i] - cost[i]; if(S<min_S) { min_S = S; position = (i+1) % gas.size(); } } if(S>=0) return position; else return -1; }