首页 > 其他分享 >[ABC320F] Fuel Round Trip 题解

[ABC320F] Fuel Round Trip 题解

时间:2023-09-17 09:01:51浏览次数:64  
标签:std dist min 题解 valueType 行程 ABC320F Fuel DP

题意

在坐标轴上给定 \(N\) 个点,坐标依次为 \(X_1, X_2, \cdots, X_N\),你需要从原点前往 \(X_N\) 并折返,其中在第 \(1\) 个到第 \(N - 1\) 个点上有加油站,其中第 \(i\) 个加油站可以花费 \(P_i\) 购买 \(F_i\) 升汽油,汽油持有上限为 \(H\) 升,每行驶一单位距离需要花费一升汽油。在全部过程中每个加油站至多使用一次,判断是否可以完成行程并输出最小花费。

(\(1 \le N, H \le 300\))。

题解

考虑 \(\tt{DP}\),考虑将反向行驶(\(0 \leftarrow X_N\))的过程视为正向行驶(\(0 \rightarrow X_N\)),那么问题转化为了进行两次正向行驶(\(0 \rightarrow X_N\))的行程且不能使用同一个加油站的最小花费,设 \(f_{i, j, k}\) 代表行驶到第 \(i\) 个加油站,两次行程分别还持有 \(j\) 升油和 \(k\) 升油的最小花费。

转移是显然的,考虑是否加油,为哪次行程加油即可,有转移

\[\begin{aligned} f_{i + 1, j, k} &\leftarrow f_{i, j, k} \\ f_{i + 1, \min\left\{j + F_i, H\right\}, k} &\leftarrow f_{i, j, k} + P_i \\ f_{i + 1, j, \min\left\{k + F_i, H\right\}} &\leftarrow f_{i, j, k} + P_i \\ \end{aligned}\]

转移是 \(\mathcal{O}(NH^2)\) 的,下面我们考虑合并答案。

我们设在第一次行程到达 \(X_N\) 后油箱的剩余油量为 \(x\),那么这也就意味着我们的第二次行程开始的起始油量只有 \(x\),但是由于在转移中我们是正向考虑的,即从 \(0\) 以满邮箱开始转移,那么我们考虑转化起始油量的限制。我们发现,若没有第一次行程的干扰,第二次行程可以视为从满油开始,若第一次行程后邮箱剩余油量为 \(x\),这也就意味着在第二次行程开始时有 \(H - x\) 升油被扣除无法使用,从正向来说就是从 \(0\) 以满油开始,到达后需剩余 \(H - x\) 升油以备扣除。那么我们有答案的表达式

\[Ans = \max\limits_{0 \le i \le H, H - i \le j \le H} f_{N, i, j} \]

合并答案的复杂度是 \(\mathcal{O}(H^2)\) 的,总复杂度 \(\mathcal{O}(NH^2)\),可以通过本题。

Code

#include <bits/stdc++.h>

typedef long long valueType;
typedef std::vector<valueType> ValueVector;
typedef std::vector<ValueVector> ValueMatrix;
typedef std::vector<ValueMatrix> ValueCube;

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);

    valueType N, H;

    std::cin >> N >> H;

    ValueVector X(N + 1, 0), F(N + 1, 0), P(N + 1, 0);

    for (valueType i = 1; i <= N; ++i)
        std::cin >> X[i];

    for (valueType i = 1; i < N; ++i)
        std::cin >> P[i] >> F[i];

    constexpr valueType MAX = std::numeric_limits<valueType>::max() >> 2;

    ValueCube DP(N + 1, ValueMatrix(H + 1, ValueVector(H + 1, MAX)));

    DP[0][H][H] = 0;

    for (valueType i = 0; i < N; ++i) {
        for (valueType a = 0; a <= H; ++a) {
            for (valueType b = 0; b <= H; ++b) {
                valueType const dist = X[i + 1] - X[i];

                if (a >= dist && b >= dist)
                    DP[i + 1][a - dist][b - dist] = std::min(DP[i + 1][a - dist][b - dist], DP[i][a][b]);

                if (std::min(a + F[i], H) >= dist && b >= dist)
                    DP[i + 1][std::min(a + F[i], H) - dist][b - dist] = std::min(DP[i + 1][std::min(a + F[i], H) - dist][b - dist], DP[i][a][b] + P[i]);

                if (a >= dist && std::min(b + F[i], H) >= dist)
                    DP[i + 1][a - dist][std::min(b + F[i], H) - dist] = std::min(DP[i + 1][a - dist][std::min(b + F[i], H) - dist], DP[i][a][b] + P[i]);
            }
        }
    }

    valueType ans = MAX;

    for (valueType i = 0; i <= H; ++i)
        for (valueType j = 0; j <= H; ++j)
            if (j >= H - i)
                ans = std::min(ans, DP[N][i][j]);

    if (ans == MAX)
        ans = -1;

    std::cout << ans << std::endl;

    return 0;
}

标签:std,dist,min,题解,valueType,行程,ABC320F,Fuel,DP
From: https://www.cnblogs.com/User-Unauthorized/p/solution-ABC320F.html

相关文章

  • 【题解】AtCoder-ABC320
    AtCoder-ABC320ALeylandNumber依题意计算。提交记录:Submission-AtCoderAtCoder-ABC320BLongestPalindrome直接\(O(n^2)\)枚举,\(O(n)\)判断。提交记录:Submission-AtCoderAtCoder-ABC320CSlotStrategy2(Easy)不妨将字符串复制三遍,枚举\([0,3m)\)判断。提交......
  • 【POJ 3275】Ranking the Cows 题解(传递闭包)
    农夫约翰的N头奶牛(1≤N≤1000)产奶率各不相同,FJ希望根据这些比率从最快的奶牛到最慢的奶牛订购奶牛。FJ已经比较了M(1≤M≤10000)对奶牛的产奶率。他想列出另外C对奶牛的列表,这样,如果他现在比较这些C对奶牛,他肯定能够推断出所有N头牛的正确顺序。请帮助他确定C的最小值,这样的列表是可......
  • 合并果子题解-C++ STL priority_queue容器的使用
    说明:本博文关于priority_queue容器的说明来源于www.cnblogs.com/fusiwei/p/11823053.html本人是刚刚接触算法竞赛的萌新,如果有大佬发现了错误,还望指出(真的有人会看本蒟蒻的博文吗)这是我的第一篇博文,更多是作为测试以后会将博客作为笔记记录学习的体会基本概念priority_queu......
  • lattice crosslink开发板mipi核心板csi测试dsi屏lif md6000 fpga 常见问题解答
    1.概述    CrossLink开发板,是用Lattice的芯片CrossLink家族系列的,LIF-MD6000-6JM80I。该芯片用于桥接视频接口功能,自带2路MIPI硬核的功能,4LANE MIPI的功能,支持高速率1.5Gbps。   其他普通IO支持1.2Gbps速率,支持5路MIPI通道功能。 芯片包含LVDS,SLVS200,SubL......
  • 华为应用市场上架 视频介绍上传 遇到的问题解决
    昨天在华为应用市场上架应用, 视频介绍上传时, 一直是视频加载中,百思不得其解. 虽然不是第一次上传视频了,怎么这次遇到这个问题.偶然发现在视频介绍上传时, 选择海报后,一定要下划,点击确认,才能完成上传!否则一直是视频加载中............
  • AnyCAD程序无法启动的问题解决方法
    在某些电脑上会出现基于AnyCAD开发的程序无法启动的问题,如:System-ArgumentEcception:Pleasecheckthedependendes解决方法安装最新的VS运行时库,如VS2022:微软官方下载地址:x64:vc_redist.x64.exeSystem.AccessViolationException:"Attemptedtoreadorwriteprotected......
  • CF1542E1 Abnormal Permutation Pairs (easy version) 题解
    CF1542E1AbnormalPermutationPairs(easyversion)题解不会Hardversion对于第一个限制字典序,我们可以考虑枚举前\(i\)位相同,然后考虑后\(n-i\)位。我们只需要保证\(p_{i+1}<q_{i+1}\)即可。我们设\(len=n-i\)。由于前\(i\)位完全相同,所以前\(i\)位内部......
  • CF1852B Imbalanced Arrays 题解
    CF1852BImbalancedArrays题解Links洛谷CodeforcesDescription对于一个给定的长度为\(n\)的数组\(A\),定义一个长度为\(n\)的数组\(B\)是不平衡的当且仅当以下全部条件满足:\(-n\leqB_{i}\leqn\)且\(B_{i}\ne0\)。即每个数在\([-n,n]\)内且不为\(0\)。......
  • LeetCode-Java题解 209. Minimum Size Subarray Sum
    题目地址:209.MinimumSizeSubarraySum解题思路:    看到这道题,心里本身是有双指针这个概念的,但是不知道怎么用,脑子里第一反应就是暴力解法,双for一把梭,然后时间就超时了...看了题解才知道滑动窗口这个解法,不禁直呼妙啊!感觉和双指针非常类似,其核心点在于避免了暴力算法的枚......
  • 题解 UVA1566 John
    题目描述两个人轮流取石子,每人每次可以\([1,a_i]\)个石子,最后取完石子的人为负。问最终谁会赢。具体思路若堆数为\(1\)且该堆数量为\(1\),先手必败。若堆数不为\(1\)且每堆数量都为\(1\),若有奇数堆,先手比败,否则,先手必胜。若堆数不为\(1\),转换为\(Nim\)游戏,判......