[题解]UVA1442 洞穴 Cav
思路
首先我们可以从左往右扫描一遍,然后从右往左扫描一遍,最后两条扫描出的线,最低的那条线减去 就是答案(如图)。
这张图就是我们两次扫描出的结果(红线:从左往右,绿线:从右往左)。
那为什么扫描出的是这样的图呢?
是因为我们在扫描的时候需要做出 3 个步骤:
- 当 时:说明燃料断开了,需要将 设为 。
- 当 时:说明燃料太高了,需要将 设为 。
- 用一个 数组储存每次的 值。
这样说来就比较清晰了,直接上代码。
Code
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int T,n;
int p[N],s[N],x[N];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> T;//T 组数据
while (T--){
cin >> n;//读入
for (int i = 1;i <= n;i++) cin >> p[i];
for (int i = 1;i <= n;i++) cin >> s[i];
int res = 0;
int now = s[1];//这个初始值很重要
for (int i = 1;i <= n;i++){//从左往右扫描
if (p[i] > now) now = p[i];
if (s[i] < now) now = s[i];
x[i] = now;
}
now = s[n];//初始值
for (int i = n;i;i--){//从右往左扫描
if (p[i] > now) now = p[i];
if (s[i] < now) now = s[i];
res += min(x[i],now) - p[i];//我们直接省略从右往左扫描的结果,直接对 x[i] 与当前的 now 取最小值算出结果即可。
}
cout << res << endl;//输出
}
return 0;
}
作者:WaterSun
出处:https://www.cnblogs.com/WaterSun/p/18268813
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】