[题解]UVA1442 洞穴 Cav

思路

首先我们可以从左往右扫描一遍,然后从右往左扫描一遍,最后两条扫描出的线,最低的那条线减去 \(p_i\) 就是答案(如图)。

这张图就是我们两次扫描出的结果(红线:从左往右,绿线:从右往左)。

那为什么扫描出的是这样的图呢?

是因为我们在扫描的时候需要做出 3 个步骤:

  1. \(p_i > now\) 时:说明燃料断开了,需要将 \(now\) 设为 \(p_i\)
  2. \(s_i < now\) 时:说明燃料太高了,需要将 \(now\) 设为 \(s_i\)
  3. 用一个 \(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;  
}  
posted @ 2024-06-26 12:37  WBIKPS  阅读(19)  评论(0)    收藏  举报