// 桶装水问题
int main()
{
for(int k=0;k<20;k++)
{
int A[7]={0};
for(int ii=0;ii<7;ii++)
{
int tmep=rand()%6+1;
cout<<tmep<<" ";
A[ii]=tmep;
}
cout<<endl;
int len=sizeof(A)/sizeof(*A); // 长度,7
int res=0; //结果变量
int L=0; // 最左边界
int R=len-1; //最右边界
int last=0; //上次遍历过程中最低的高度
while(L<R)
{
int distance=R-L;// 当前最左和最右的长度距离
int temp=A[L]>A[R]?A[R--]:A[L++];
//更新最左和最右中最低的那个高度,并移动对应下标
int hight=temp>last?temp-last:0;
//高度是因为当前的高度大于之前的高度,则更新高度差,否则不更新高度差,并设定为0。
// 比如 3 2 3 4;
// 第一步是 距离为3,高度为3,L++, 高度差变为3;
// 第二步:距离为2,高度为2,但是比之前高度3小,所以高度差设定为0,L++;
// 第三步:距离为1,高度为3,但是之前高度3小,所以高度差设定为0,L++;
// 第四步:L<R 不成立,则结束循环;
res+=(distance)*hight;
last=hight>0?temp:last;
// 如果高度差大于0,则说明当前遍历的最小高度都比之前的高度大,说明此时能够装高度差那么多水。
}
cout<<res<<endl;
}
return 0;
}