列表

详情


NC54250. 装水容器

描述

给定 n 个非负整数  a_1,a_2,...,a_n ,每个数代表第  i 个木板的高度 h(  单位 m),忽略木板体积,木板宽度为 1m。现在把这些木板间隔 1m 均匀的放在一个大小合适的容器内。你需要找出两条木板,使得他们之间构成的容器可以容纳最多的水。

俩木板选定之后会拆除其他木板,你只用计算这俩木板组成容器的容积。

输入描述

题目有多组数据,第一行 T 表示数据组数
每组数据第一行 n
接下来一行为 n 个木板的高度,空格分隔。

输出描述

给出每组能容纳最多的水的体积。

示例1

输入:

1
9
1 8 6 2 5 4 8 3 7

输出:

49

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

JavaScript V8 解法, 执行用时: 12ms, 内存消耗: 5016K, 提交时间: 2022-11-13 11:31:38

var T = readline()
for(var q = 0;q<T;q++){
    var n = readline()
    var arr = readline().split(' ')
    var max = 0;
    for(var i= 0;i<n-1;i++){
        var left = arr[i]
        for(var j= 1;j<n;j++){
            var min = Math.min(left,arr[j])
            var len = j-i
            var num = min*len
            max = Math.max(num,max)
        }
    }
     console.log(max)
}

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 408K, 提交时间: 2019-10-26 00:30:25

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int T;
	cin>>T;
	for(int i=1;i<=T;i++)
	{
		int imax=0;
		int n,a[100];
		cin>>n;
		for(int i=0; i<n;i++)cin>>a[i];
		for(int k=0; k<n;k++)
			for (int j=k;j<n;j++)
			{
				if (k==j)continue;
				int imin=min(a[k],a[j])*(j-k);
				imax=max(imin,imax);
			}
		cout<<imax<<endl;
	}
	return 0;
}

C++ 解法, 执行用时: 4ms, 内存消耗: 312K, 提交时间: 2022-07-11 16:56:44

#include<bits/stdc++.h>
using namespace std; 
int main(){
	int T;
	cin>>T;
	while(T--){
		int n;
		cin>>n;
		vector<int> s(n);
		for(int i=0; i<n; i++)cin>>s[i];
		int M=0;
		int i=0,j=n-1;
		while(i<j){
			int k=min(s[i],s[j])*(j-i);
			if(s[i]>s[j])j--;
			else i++;
			M=max(M,k);
		}
		cout<<M<<endl;
	}
	return 0;
}

上一题