您的位置:首页 > 其它

Cav UVA - 1442

2017-08-22 10:32 260 查看
题目传送门

题意:已知一个洞穴由宽度为n个片段组成,已知每一个片段的顶部高度和地面高度,要在洞穴里储存尽可能多的燃料,但是任何一个片段的燃料都不能触碰到洞穴的顶部。

思路:这个题目还用到了连通器原理啊,连通的水面高度相同,不难想到就是要求出每一个片段的高度,但是如果全部枚举的话,时间复杂度显然是不够的,所以使用扫描法,从左扫描一次,从右扫描一次,就可以求出答案了。

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <time.h>
#include <vector>

#define MAXN 1000010
#define MAXE 210
#define INF 10000000
#define MOD 1000000007
#define LL long long
#define pi acos(-1.0)

using namespace std;

int p[MAXN];
int s[MAXN];
int h1[MAXN];
int h2[MAXN];

int main() {
std::ios::sync_with_stdio(false);
int T;
cin >> T;
for (int kase = 1; kase <= T; ++kase) {
int n;
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> p[i];
}
for (int i = 1; i <= n; ++i) {
cin >> s[i];
}
int l = INF;
for (int i = 1; i <= n; ++i) {
if (l > s[i])
l = s[i];
else if (l < p[i])
l = p[i];
h1[i] = l;
}
int r = INF;
for (int i = n; i >= 1; --i) {
if (r > s[i])
r = s[i];
else if (r < p[i])
r = p[i];
h2[i] = r;
}
int sum = 0;
for (int i = 1; i <= n; ++i) {
sum += min(h1[i], h2[i]) - p[i];
}
cout << sum << endl;
}
return 0;
}

/*
1
15
6 6 7 5 5 5 5 5 5 1 1 3 3 2 2
10 10 10 11 6 8 7 10 10 7 6 4 7 11 11
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: