题目链接: http://acm.oinsm.com/problem.php?cid=1022&pid=4
解题思路
这题,一开始,我一想,来个单调栈不就好了嘛,冲冲冲!wa了,那我就正的一遍,反的一遍,冲冲冲,emmmm,又wa了!
(我就直接引用官方题解了,哈哈)
双指针法
这种方法背后的思路在于,两线段之间形成的区域总是会受到其中
较短那条长度的限制。此外,两线段距离越远,得到的面积就越
大。
我们在由线段长度构成的数组中使用两个指针,一个放在开始,一
个置于末尾。 此外,我们会使用变量 maxarea 来持续存储到目前
为止所获得的最大面积。 在每一步中,我们会找出指针所指向的两
条线段形成的区域,更新 maxarea,并将指向较短线段的指针向较
长线段那端移动一步。
查看下面的例子将有助于你更好地理解该算法:
1 8 6 2 5 4 8 3 7
总的来说,有两种情况可以得到较大的面积
- 两块板较高
- 两块板的间隔距离教远
代码
#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;
}