题目:
示例输入: 示例输出:
12 (表示积水的宽度) 6
0 1 0 2 1 0 1 3 2 1 2 1
分析:
对于本题,找到积水的总面积,那么只要找到每个积水的竖条水柱的面积,然后相加,就能求出总面积。而对于每个积水的竖条水柱,其面积这里也就简化为其高度,如果说我们知道该竖条水柱所在的积水区域水面所处的高度,然后减去该竖条水柱下黑框的高度即可求出该竖条水柱的高度。可能比较抽象,这里以上面的积水图片为例介绍下,现在给每个竖条编号如下:
那么比如对于第二块积水,其水面高度为2,而下标为4和6的高度为1,那么4,6的每个都拥有高度为1的积水,同理,下标为5的竖条水柱高度就为2,那么就可以得到第二块积水的面积为1+2+1=4,然后求出每个积水区域面积或每个竖条水柱的高度之和即可。
而竖条水族下的黑框高度即对应输入的数组中的值,而每块积水的高度则等于其左右墙壁中较低的那面墙壁的高度, 现在分别用left[i]和right[i]表示下标为i的竖条水柱所在积水的左,右侧墙壁的值,至于left[i]和right[i],其实就分别是下标0到i黑框高度的最大值和下标i到n-1黑框高度的最大值,最后取下标0到i黑框高度的最大值中最大值即可求得该积水的水面的高度,下面的步骤上述已介绍。
那么就不多废话,直接贴上源代码:
#include<iostream> #include<vector> using namespace std; #define Max 10000 vector<int> arr; int N; int solve() {int left[Max],right[Max],result=0;for(int i=0;i<N;i++){left[i]=(i==0?arr[0]:max(left[i-1],arr[i]));}for(int i=N-1;i>=0;i--){right[i]=(i==N-1?arr[N-1]:max(right[i+1],arr[i]));}for(int i=0;i<N;i++){result+=min(left[i],right[i])-arr[i];}return result; } int main() {cin>>N;for(int i=0;i<N;i++){int temp;cin>>temp;arr.push_back(temp);}cout<<solve()<<endl;return 0; }
PS:最近看两本《挑战》书,遇到了相同的内容,于是又看了些算法视频,跟着刷了一些题目,美滋滋~