T6. 燃料
小明要开车从家里前往远方的城市 ,他家到城市的路程是 公里。他的车每开 公里需要消耗 升汽油,车的油箱最多只能装 升汽油,出发前他的车是加满汽油的。
路途中有 个加油站,第 个加油站离小明家的路程是 公里,在这里可以花费 元加 升汽油且只能加一次。但是如果超过了油箱容量,就只能加满为止。
问小明到达城市 至少需要花费多少?
输出到达城市 需要花费的最小值。如果无法到达,输出 -1
。
限制:
算法分析
记 dp[i][j]
表示到第 个加油站且(加油前)油剩 升时的最小花费
初值:,其他
用求好的 dp[i][j]`` 去推出
dp[i+1][?]`` 的最小
第 个加油站看做是家
第 个加油站看做是终点
代码实现
#include <bits/stdc++.h> #define rep(i, n) for (int i = 0; i < (n); ++i) using namespace std; using ll = long long; const ll INF = 1e18; int x[2005], v[2005], w[2005]; ll dp[2005][2005]; inline void chmin(ll& x, ll y) { if (x > y) x = y; } int main() { int n, V, L; cin >> n >> V >> L; for (int i = 1; i <= n; ++i) { cin >> x[i] >> v[i] >> w[i]; } x[n+1] = L; memset(dp, 0x3f, sizeof dp); dp[0][V] = 0; rep(i, n+1) { rep(j, V+1) { int t = x[i+1]-x[i]; int nj; // 不加油直接出发,到下一站要消耗t nj = j-t; if (nj >= 0) chmin(dp[i+1][nj], dp[i][j]); // 加油后出发,到下一站剩余 min(j+v[i], V)-t nj = min(j+v[i], V)-t; if (nj >= 0) { chmin(dp[i+1][nj], dp[i][j]+w[i]); } } } ll ans = INF; rep(j, V+1) chmin(ans, dp[n+1][j]); if (ans == INF) ans = -1; cout << ans << '\n'; return 0; }
T7. 穿越战场
有一个长方形战场,战场地图被分成 行 列一共 个方格区域。从北向南编号为 行,从西向东编号为 列。
战场上有若干个格子内有敌人的哨所,第 个哨所在第 行第 列。
你现在要和东北方的大部队会和。你的任务是从战场南边界(第 行)的任意位置进入战场,在 分钟内,从北边界(第 行)的一个尽量靠东的位置离开战场。战场是一个平原,每次移动,你都可以从当前所在格子移动到上下左右的格子,进入战场的时刻定为第 分钟, 次移动花费 分钟的时间。只要到达北边界的时间小于等于 分钟就可以。
移动过程中,离敌人的哨所越近,被发现的风险越高。我们定义整个移动路线的安全程度,等于途中离敌人哨所距离的最小值。我们定义距离为行列差的绝对值之和: 行 列与 行 列的距离为 。
在满足 分钟内离开战场的前提下,求你的路线的安全程度的最大值,安全程度最大的路线的终点的列坐标。如果有多条路线安全程度都是最大,输出其中列坐标最大的终点。
限制:
算法分析
二分安全度
check(d) 有没有安全度 (也就是路线上每格与哨所距离 )且时间 的路线
路线上每格与哨所距离 ,我们可以不走与哨所距离 的格子,判断能否在 的时间内到达北边界
以南边界上所有点为起点,做一遍多源bfs,求出所有北边界上点的最短路,之后找一下北边界上有无最短路 的格子,返回其中最大的列坐标,没找到返回
在 check 中要判断每个格子与哨所距离是否 ,如果在 check 中现场判断的话:
只能在二分前,先计算出每个点与哨所的最短距离(最短路)
以所有哨所为起点,做一次多源bfs
最后的时间复杂度为
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现