首页 > 其他分享 >134. 加油站

134. 加油站

时间:2023-05-06 18:55:19浏览次数:42  
标签:汽油 sum gas 加油站 cost 134 油箱

在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。

你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。

给定两个整数数组 gas 和 cost ,如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。

输入: gas = [1,2,3,4,5], cost = [3,4,5,1,2]
输出: 3
解释:
从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油
开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油
开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油
开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油
开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油
开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。
因此,3 可为起始索引。

我的解法

我们可以通过gas-cost 来得到每个加油站的剩余油量,然后假设从下标0为起点,通过sum += gas[i] - cost[i]计算到达i下标时的剩余油量,当遍历整个数组的时候,如果sum小于0,说明一定没有路径,如果大于等于0说明存在路径。

那我们如何找到这条路径呢?

我们观察发现这条路径总是出现在最小剩余油量的右侧,这是因为我们最后的sum已经大于等于0,所以从最小油量的右侧位置出发可以让我们把减少油量最多的部分放到最后。

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int len = gas.size();
        int min = INT32_MAX,sum = 0,res = 0;
        for (int i = 0; i < len; i++) {
            sum += gas[i] - cost[i];
            gas[i] = sum;
            if(sum <= min) { 
                min = sum;
                res = i;
            }
        }
        if(sum < 0) return -1;
        else return (res+1)%len;
    }
};

for循环里sum <= min 而不是 < 是因为可能存在这种剩余油量的情况

毫无疑问,我们想要的是后面的最低点,所以等于的时候也需要更新最低油量。

标签:汽油,sum,gas,加油站,cost,134,油箱
From: https://www.cnblogs.com/lihaoxiang/p/17378277.html

相关文章

  • AtCoder Regular Contest 134 D Concatenate Subsequences
    洛谷传送门AtCoder传送门我一年前甚至不会做/qd发现\(a_{x_1}\)为\(k=\min\limits_{i=1}^na_i\)时最优。然后开始分类讨论:如果\(\min\limits_{a_i=k}a_{i+n}\lek\),答案为\((k,\min\limits_{a_i=k}a_{i+n})\)。这是因为如果再选一个\(k\)肯定不优。否则......
  • P1345 [USACO5.4]奶牛的电信Telecowmunication 题解
    一、题目描述:n个点,m条边,给定起点s和终点t,求最少删去几个点后,s和t不连通。注意,s和t不能删掉。1<=n<=100,1<=m<=600; 二、解题思路:刚刚学了最大费用流,知道最大流等于最小割。但此题割的不是边,是点。我们需要将将割点转化为割边。把一个点切成两半......
  • [LeetCode] 1342. Number of Steps to Reduce a Number to Zero 将数字变成 0 的操作
    Givenaninteger num,return thenumberofstepstoreduceittozero.Inonestep,ifthecurrentnumberiseven,youhavetodivideitby 2,otherwise,youhavetosubtract 1 fromit.Example1:Input:num=14Output:6Explanation: Step1)14ise......
  • P6134 [JSOI2015]最小表示
    P6134[JSOI2015]最小表示思:有向无环图,想到拓扑排序。逆序枚举,因为排序后下标小的点用到它前面的点的联通性。对其连接的点按照拓扑序由小到大进行排序(靠前的点可以连接的点多,那么可以删的边数也变多。其余套路与可达性统计类似,注意代码细节。#include<bits/stdc++.h>......
  • [oeasy]python00134_[趣味拓展]python起源_历史_Guido人生_ABC编程语言_Tanenbaum
    python历史回忆上次内容颜文字是kaomoji把字符变成一种图画的方法一层叠一层很多好玩儿的kaomoji是一层层堆叠起来的meme虚拟的表情也在真实世界有巨大影响一步步地影响字符编码就是这样一步步发展过来的python也是一步步发展到今天的python究竟是怎么发展的呢?......
  • [oeasy]python00134_[趣味拓展]python起源_历史_Guido人生_ABC编程语言_Tanenbaum
    python历史回忆上次内容颜文字是kaomoji把字符变成一种图画的方法一层叠一层很多好玩儿的kaomoji是一层层堆叠起来的meme ​ 添加图片注释,不超过140字(可选) 虚拟的表情也在真实世界有巨大影响一步步地影响 ​......
  • LightOJ 1348 Aladdin and the Return Journey (树链剖分)
    树链剖分模板题。最近一直有比赛。。好长时间没写了。明显生疏了。。找个模板题熟悉一下。代码如下:#include<iostream>#include<string.h>#include<math.h>#include<queue>#include<algorithm>#include<stdlib.h>#include<map>#include<set>#include......
  • 【贪心算法】NO134 加油站
    134.加油站在一条环路上有n个加油站,其中第i个加油站有汽油gas[i]升。你有一辆油箱容量无限的的汽车,从第i个加油站开往第i+1个加油站需要消耗汽油cost[i]升。你从其中的一个加油站出发,开始时油箱为空。给定两个整数数组gas和cost,如果你可以绕环路行驶一周,则返......
  • 旅行 Tour uva1347
    直角坐标系中,有nn个点。要求先从左往右走,再从右往左走,不重复的经过每一个点。求出最短路径(距离为两点间直线距离)。 f[i][j]表示点1~max(i,j)已走过,的路径长度 #include<iostream>#include<algorithm>#include<cstring>#include<cmath>#include<iomanip>......
  • 1345. 跳跃游戏 IV
    题目描述给一个数组arr,起点是0,终点是n-1有3种选择:可以退一步、进一步、跳到值相等的位置问跳到终点的最少操作次数?f1哈希表+bfs基本分析为什么是bfs?求从起点到终点的最短路图是什么?当前节点到前、后、等值可跳的索引怎么获取x到所有等值点索引y的映射关系?哈希表预处理......