ZJYYCOJ-最多水容量

题目链接: http://acm.oinsm.com/problem.php?cid=1022&pid=4

在这里插入图片描述

解题思路

这题,一开始,我一想,来个单调栈不就好了嘛,冲冲冲!wa了,那我就正的一遍,反的一遍,冲冲冲,emmmm,又wa了!
(我就直接引用官方题解了,哈哈)
双指针法

这种方法背后的思路在于,两线段之间形成的区域总是会受到其中
较短那条长度的限制。此外,两线段距离越远,得到的面积就越
大。

我们在由线段长度构成的数组中使用两个指针,一个放在开始,一
个置于末尾。 此外,我们会使用变量 maxarea 来持续存储到目前
为止所获得的最大面积。 在每一步中,我们会找出指针所指向的两
条线段形成的区域,更新 maxarea,并将指向较短线段的指针向较
长线段那端移动一步。

查看下面的例子将有助于你更好地理解该算法:

1 8 6 2 5 4 8 3 7
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总的来说,有两种情况可以得到较大的面积

  1. 两块板较高
  2. 两块板的间隔距离教远

代码

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 20005;
const int INF = 1e9;
int num[MAXN];
int main()
{
    ios::sync_with_stdio(false);
    int n;
    while(cin >> n){
        for(int i = 1; i <= n; i++) cin >> num[i];
        int maxn = 0;
        int l = 1, r = n;
        while(l <= r) {
            while(num[l] == 0) l++;
            while(num[r] == 0) r--;
            if(r <= 0 || l > n) break;
            maxn = max(maxn, min(num[l], num[r]) * abs(r - l));
            if(num[l] <= num[r]) {
                l++;
            }
            else{
                r--;
            }
        }

        cout << maxn << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值