您的位置:首页 > 其它

UVA1442_Cave

2015-09-10 03:46 309 查看
Cave

大致题意:

一个洞穴,已经i位置地面高度和顶的高度,要求在这个洞穴里面储蓄尽可能多的燃料,而且任何位置燃料不能碰到顶点

思路:

先从左往右扫描一下得出每一个点燃料能达到的最大高度,然后右边一样扫一遍,两个取最小值,然后累加

看起来很简单,可是实践起来很麻烦,需要讨论好不同条件下的最大高度!!!!

首先我们假设一个位置左端的最大高度为h

那么i+1位置地面高度p,顶点高度是s.

如果p>h,说明燃料被阻断!!!i+1位置上最大高度为自己!!!

如果s<h,说明当前最大高度还是h

如果p<h,最大高度和之前相同

反正扫描一下,就好了,这样充分保证了一个点左右均合法了!!!!

这个和以前遇到的最大长方形面积很相似





#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<queue>
#include<cstdlib>
#include<algorithm>
#include<stack>
#include<map>
#include<queue>
#include<vector>

using namespace std;
const int maxn = 1e6+100;
#define pr(x) cout << #x << " = " << x << " ";
#define prln(x) cout << #x << " = " << x <<endl;
#define ll long long
int p[maxn], s[maxn], h[maxn], lev, ans, n;
int main(){
#ifdef LOCAL
    freopen("C:\\Users\\User Soft\\Desktop\\in.txt","r",stdin);
  //freopen("C:\\Users\\User Soft\\Desktop\\out.txt","w",stdout);
 #endif
    int t; cin >> t;
    while(t--) {
        cin >> n;
        ans = 0;
        for(int i = 0; i < n; ++i) scanf("%d", p +i);
        for(int i = 0; i < n; ++i) scanf("%d", s +i);
        lev = s[0];
        for(int i = 0; i < n; ++i) {
            if(lev < p[i]) lev = p[i];
            if(lev > s[i]) lev = s[i];
            h[i] = lev;
        }
        lev = s[n-1];
        for(int i = n-1; i >= 0; --i) {
            if(lev < p[i]) lev = p[i];
            if(lev > s[i]) lev = s[i];
            ans += min(lev, h[i]) - p[i];
        }
        cout << ans << endl;
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: