Cav UVA - 1442
2017-08-22 10:32
260 查看
题目传送门
题意:已知一个洞穴由宽度为n个片段组成,已知每一个片段的顶部高度和地面高度,要在洞穴里储存尽可能多的燃料,但是任何一个片段的燃料都不能触碰到洞穴的顶部。
思路:这个题目还用到了连通器原理啊,连通的水面高度相同,不难想到就是要求出每一个片段的高度,但是如果全部枚举的话,时间复杂度显然是不够的,所以使用扫描法,从左扫描一次,从右扫描一次,就可以求出答案了。
题意:已知一个洞穴由宽度为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 */
相关文章推荐
- UVA - 1442 Cav
- UVa 1442:Cav(杂题)
- uva 1442 Cav(左右各扫描一次)
- Cav UVA - 1442
- UVA-1442 Cav
- uva 1442 - Cav(贪心)
- uva - 1442(cav 递推类 ,思路)
- UVA1442_Cave
- UVa OJ 1442 - Cav
- UVALive - 4621 Cav 贪心 + 分析
- 【高效算法设计——双向扫描】 UVa 1442 Cave
- Uva 1442 扫描法
- uva1442 cave
- UVa 1442 (线性扫描) Cave
- UVA1442 Cave
- uva1442
- uva 1442:Cave(贪心)
- UVALive - 4621 Cav 贪心 + 分析
- 1442 - Cav
- UVA 1442(p249)----Cave