桶装水问题 C++实现

// 桶装水问题
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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值