问题 E: 最多水容量

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

输入
测试数据由多组输入样例组成
第一行输入一个整数N,( 2 <= N <= 20000 )
第二行输入N个整数 ni ( 0 <= ni <= 10000),分别代表挡板的高度
输出输出能够获取的最多水容量样例输入 Copy9
1 8 6 2 5 4 8 3 7
样例输出 Copy49
提示题目给出的样例详细可以见图
思路:双指针算法
使用变量存储最大面积,移动指针
1.错误代码

#include<bits/stdc++.h>
using namespace std;
int h[11000];
int max(int a,int b){    
if(a>b) return a;    
return b;
}
int main(){    
int n,are;    
while(cin>>n){
        are=0;
 for(int i=0;i<n;i++){            
   cin>>h[i];        
   }        
   int l=0,r=n-1;        
   while(l<r){            
   if(h[l]>h[r]){                
   are=max(are,(r-l)*h[r]);                
   r--;            
   }            
   else{                
   are=max(are,(r-l)*h[l]);                
   l++;            
   }        
   }        
   cout<<are<<endl;    
   }    
   return 0;
   }

错误:数组超限,max函数不用定义,可直接使用
2.正确代码

#include<bits/stdc++.h>
using namespace std;
int h[110000];
int main(){    
int n,are;    
while(cin>>n){        
are=0;        
for(int i=0;i<n;i++){            
cin>>h[i];        
}        
int l=0,r=n-1;        
while(l<r){            
if(h[l]>h[r]){                
are=max(are,(r-l)*h[r]);               
 r--;           
  }            
  else{                
  are=max(are,(r-l)*h[l]);                
  l++;            
  }        
  }        
  cout<<are<<endl;   
   }    
   return 0;
   }
发布了12 篇原创文章 · 获赞 0 · 访问量 121

猜你喜欢

转载自blog.csdn.net/weixin_45987032/article/details/104524945