题目描述:
给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水
说明:你不能倾斜容器,且 n 的值至少为 2。
示例:
输入: [1,8,6,2,5,4,8,3,7] 输出: 49
详细解题:
和原题目相比我们可以设计更高级一些,就是输入多少个数由我们自己决定
所以在主函数中设置n:
int main()
{
int n;
cout<<"Please input n :"<<endl;
cin>>n;
然后创建一个Point类用来盛放多个数据:
class Point
{
public:
Point(int xx=0,int yy=0)
{
x=xx;
y=yy;
}
void set(int xx,int yy)
{
x=xx;
y=yy;
}
int Getx(){return x;}
int Gety(){return y;}
protected:
int x,y;
};
再用一个Area类进行不同面积的比较,其中point类的指针作为私有成员,并且在其中运用了
动态函数。
class Area
{
public:
Area(int nn)
{
n=nn;
p=new Point[n];
for(int i=0;i<n;i++)
{
q++;
int x;
cout<<"Input x:"<<endl;
cin>>x;
p[i].set(q,x);
}
}
void GetArea()
{
int a=0,x1,y1,x2,y2;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
int m,n;
if(p[i].Gety()>p[j].Gety())
{
n=p[j].Gety();
}
else
{
n=p[i].Gety();
}
m=fabs(p[i].Getx()-p[j].Getx())*n;
if(m>a)
{
a=m;
x1=p[i].Getx();
y1=p[i].Gety();
x2=p[j].Getx();
y2=p[j].Gety();
}
}
}
cout<<"The most area is "<<a<<endl;
cout<<"("<<x1<<","<<y1<<") ("<<x2<<","<<y2<<")"<<endl;
}
~Area()
{
delete [] p;
}
private:
int n;
static int q;
Point *p;
};
int Area::q=0;
最后在主函数中进行实现:
int main()
{
int n;
cout<<"Please input n :"<<endl;
cin>>n;
Area A(n);
A.GetArea();
return 0;
}
注意:
因为Point类的指针是Area类的私有成员,所以在Point类中要有默认构造函数