Sicily - Water 【寻找规律】
来源:互联网 发布:新手怎样做淘宝客 编辑:程序博客网 时间:2024/06/05 08:07
移动信息工程学院即将要离开中珠了, KY在珠海认识了很多女孩,自然很舍不得中珠。于是,他想为这些女孩留下一些礼物,最近中珠阴雨绵绵,五行缺水的他于是想到留下最珍贵的中珠雨水作为纪念。现在他想尽可能地收集到多一点的中珠雨水,假设中珠的地形抽象为一张二维的海拔图,区域的个数为n,每一个区域的地形宽度为1,高度用一个H表示,那么你能帮KY计算一下他最多能在这样的地形内接到多少(面积)中珠雨水吗?
如下图的海拔图中,每个区域的高度分别为[0,1,0,2,1,0,1,3,2,1,2,1],那么他最多可以接到6个单位面积的中珠雨水。
输入包含多组测试样例。
每组测试样例包含两行,第一行为一个整数N (1<=N<=10^6),代表地形区域的个数,第二行有N个整数,代表每个区域的高度H ( 1 <= H <= 100 ),用空格隔开。
N为0时输入结束。
每组数据输出一个整数,表示KY最多能接到的中珠雨水(面积)。
120 1 0 2 1 0 1 3 2 1 2 10
6
分析:
1) 刚开始先初始化盛水区间的左边界cur=0,然后ans=0,sum=0,之后开始遍历1 ~ n-1
2)当遍历到a[i]时,如果a[i]<a[cur],sum += a[i]
3) 当遍历到a[i]时,如果a[i]≥a[cur]:
2.1)若i=cur+1,这说明cur不可能是盛水区间的左边界,i才是,于是将盛水区间的左边界cur置为i。
2.2)若i>cur+1,说明已经遍历完了一个盛水区间(经历了总体为先降后升的变化),到这里就可以加上该盛水区间的积水了:ans += (cur-i-1)*a[cur] - sum,而且将sum=0,将左边界cur更新为i
这样做还有一个问题,就是可能a[cur]是全局最大值,它的右边没有比他还大的了,那么解决办法也很自然:
从右到左再扫描一遍就好了,扫描区间为[cur, n-1]
#include <cstdio>#include <iostream>using namespace std;int a[1000005];int main (){ int n; while(scanf("%d", &n) != EOF && n) { for(int i=0; i<n; i++) { scanf("%d", &a[i]); } int cur = 0, sum=0, ans=0; for(int i=cur+1; i<n; i++) { if(a[i] >= a[cur]) { if(i-cur-1) { ans += (i-cur-1)*a[cur]-sum; } cur = i; sum = 0; } else { sum += a[i]; } } int lb = cur; cur = n-1, sum=0; for(int i=cur-1; i>=lb; i--) { if(a[i] >= a[cur]) { if(cur-i-1) { ans += (cur-i-1)*a[cur]-sum; } cur = i; sum = 0; } else { sum += a[i]; } } printf("%d\n", ans); } return 0;}
- Sicily - Water 【寻找规律】
- 【寻找规律】函数
- sicily 1028之找规律
- LeetCode Rotate Function(寻找规律)
- Sicily - 17958 - Algorithm Lectures 【找规律】
- 寻找符合学生成长规律的教育
- hdu1005 Number Sequence寻找规律题
- 分析事物的方法:寻找规律。
- 人在识别物体时会寻找规律
- sicily 1370 How many 0's? 递推 规律
- LeetCode365. Water and Jug Problem(找规律)
- DUTacm 1085 Water Problem(矩阵快速幂 找规律)
- #sicily#1001.寻找第k大数字(numberk)
- 寻找最大储水量的容器 Container With Most Water
- Trapping Rain Water 左右指针寻找最大容量的水
- 如何寻找软件测试Bug 100%毕现的规律?
- Who wants to live forever 分治 寻找^运算规律
- leetcode--寻找规律题,统计总数之类题目--待更
- Sicily - 17958 - Algorithm Lectures 【找规律】
- NYOJ 742 —— 最大m段和 【区间DP】
- tyvj 1305 —— 长度不超过m的最大连续和 【前缀和+单调队列】
- Android 开发实战经验总结
- HDU 2746 ——Max Sum Plus Plus Plus 【dfs+带备忘 或 DP】
- Sicily - Water 【寻找规律】
- POJ 3783 ——Balls 【DP】
- Java集合类的继承关系
- HDU 1846 —— Brave Game
- HDU 2147 —— kiki's game
- HDU 1907、2907 【NIM、anti-NIM】
- HDU 2149 —— Public Sale
- 【小马迷途】—myeclipse快速开发技巧
- HDU 1850 —— Being a Good Boy in Spring Festival