ZJYYCOJ 最多水容量(暴力/双指针)

  • 题目描述
    现在有一条笔直的水槽,里面有N块挡板。你需要从中选取两块挡板,使得能够获取最多的水容量。
    在这里插入图片描述

  • 输入
    测试数据由多组输入样例组成
    第一行输入一个整数N,( 2 <= N <= 20000 )
    第二行输入N个整数 ni ( 0 <= ni <= 10000),分别代表挡板的高度

  • 输出
    输出能够获取的最多水容量

  • 样例输入

  • 9
    1 8 6 2 5 4 8 3 7

  • 样例输出

    49

  • 题解思路
    1.暴力法(过于简单不多赘述)
    2.双指针法
    这种方法背后的思路在于,两线段之间形成的区域总是会受到其中
    较短那条长度的限制。此外,两线段距离越远,得到的面积就越
    大。
    我们在由线段长度构成的数组中使用两个指针,一个放在开始,一
    个置于末尾。 此外,我们会使用变量 maxarea 来持续存储到目前
    为止所获得的最大面积。 在每一步中,我们会找出指针所指向的两
    条线段形成的区域,更新 maxarea ,并将指向较短线段的指针向较
    长线段那端移动一步。
    查看下面的例子将有助于你更好地理解该算法:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

双指针代码

#include <bits/stdc++.h>

using namespace std;
int k[20005];

int main()
{
	ios::sync_with_stdio(false);
	int n, a, b;
	while(cin >> n)
	{
		int maxs = 0;  // 初始化最大面积
		a = 0, b = n - 1;  // 双指针初始值分别为开头结尾
		for(int i = 0; i < n; i++)
			cin >> k[i];
		while(b - a)
		{
			maxs = max(maxs, (b - a) * min(k[a], k[b]));  // 每次更新最大面积
			//短边向长边移动
			if(k[a] <= k[b])
				a++;
			else
				b--;
		}
		cout << maxs << endl;
	}
	return 0;
 } 
发布了3 篇原创文章 · 获赞 4 · 访问量 81

猜你喜欢

转载自blog.csdn.net/Melorrr/article/details/104564598