[题解]UVA1442 洞穴 Cav
思路
首先我们可以从左往右扫描一遍,然后从右往左扫描一遍,最后两条扫描出的线,最低的那条线减去 \(p_i\) 就是答案(如图)。

这张图就是我们两次扫描出的结果(红线:从左往右,绿线:从右往左)。
那为什么扫描出的是这样的图呢?
是因为我们在扫描的时候需要做出 3 个步骤:
- 当 \(p_i > now\) 时:说明燃料断开了,需要将 \(now\) 设为 \(p_i\)。
- 当 \(s_i < now\) 时:说明燃料太高了,需要将 \(now\) 设为 \(s_i\)。
- 用一个 \(x\) 数组储存每次的 \(now\) 值。
这样说来就比较清晰了,直接上代码。
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;
}

浙公网安备 33010602011771号