[题解]UVA1442 洞穴 Cav

思路

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

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

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

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

  1. pi>now 时:说明燃料断开了,需要将 now 设为 pi
  2. si<now 时:说明燃料太高了,需要将 now 设为 si
  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;  
}  

作者:WaterSun

出处:https://www.cnblogs.com/WaterSun/p/18268813

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   WBIKPS  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示