CodeForces

Dasha decided to bake a big and tasty layer cake. In order to do that she went shopping and bought n rectangular cake layers. The length and the width of the i-th cake layer were ai and birespectively, while the height of each cake layer was equal to one.

From a cooking book Dasha learned that a cake must have a form of a rectangular parallelepiped constructed from cake layers of the same sizes.

Dasha decided to bake the biggest possible cake from the bought cake layers (possibly, using only some of them). It means that she wants the volume of the cake to be as big as possible. To reach this goal, Dasha can cut rectangular pieces out of the bought cake layers. She always cuts cake layers in such a way that cutting lines are parallel to the edges of that cake layer. Dasha isn't very good at geometry, so after cutting out a piece from the original cake layer, she throws away the remaining part of it. Also she can rotate a cake layer in the horizontal plane (swap its width and length).

Dasha wants her cake to be constructed as a stack of cake layers of the same sizes. Each layer of the resulting cake should be made out of only one cake layer (the original one or cut out from the original cake layer).

Help Dasha to calculate the maximum possible volume of the cake she can bake using given cake layers.

Input

The first line contains an integer n (1 ≤ n ≤ 4000) — the number of cake layers that Dasha can use.

Each of the following n lines contains two integer numbers ai and bi (1 ≤ ai, bi ≤ 106) — the length and the width of i-th cake layer respectively.

Output

The first line of the output should contain the maximum volume of cake that can be baked using given layers.

The second line of the output should contain the length and the width of the resulting cake. If there are many solutions with maximum possible volume, print any of them.

Examples

Input
5
5 12
1 1
4 6
6 4
4 6
Output
96
6 4
Input
2
100001 900000
900001 100000
Output
180000000000
900000 100000

Note

In the first example Dasha doesn't use the second cake layer. She cuts 4 × 6 rectangle from the first cake layer and she uses other cake layers as is.

In the second example Dasha cuts off slightly from the both cake layers.

题意:给出n层蛋糕,每一层的蛋糕的长和宽分别为为 l,和 w,高为 1 ,要你求出把这个蛋糕的每层的长和宽都切成一样的时候可以得到的最大的体积(每一层的蛋糕切完的时候多余的部分会舍去)(可以完全把一层蛋糕舍去) (可以把某一层的蛋糕旋转)。

思路:写这道题目的时候想了想怎么用贪心来切,没想到怎么去贪,后面看了题目给的时间,就想用暴力应该可以过,但是如果不作任何优化的话肯定会超时,后面想了想可不可以通过排序来

优化一下,但是一开始傻了一下,想当然的以为排序暴力的时间是n*n*  n*log2 n,比n*n*n还要大,就否认了这种方法,但实际上降为了n*(n+n*log2 n),以后做题不能这样了啊,引以为戒。

代码:

#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
struct st{
	ll w,l;
}s[4040];
bool cmp(st a,st b){
	return a.w<b.w;
}
ll wl[4040];
int main(){
	ll n;
	ll a,b;
	ll i,j,k;
	scanf("%lld",&n);
	for(i=0;i<n;i++){
		scanf("%lld%lld",&a,&b);
		if(a>b){
			s[i].l=a;
			s[i].w=b;		
		}
		else{
			s[i].l=b;
			s[i].w=a;
		}
	}
	sort(s,s+n,cmp);
	ll w,l;
	ll w1,l1;
	ll sum;
	ll ans=0;
	w=s[0].w-1;
	for(i=0;i<n;i++){
		if(w==s[i].w)
		continue;
		w=s[i].w;
		for(k=0,j=i;j<n;j++,k++){//拿出宽度大于等于要切宽度的蛋糕层 
			wl[k]=s[j].l;
		}
		sort(wl,wl+k);//把他们的长从小到大排序 
		sum=0;
		l=wl[0]-1;
		for(j=0;j<k;j++){
			if(l==wl[j])
			continue;
			l=wl[j];
			sum=w*l*(k-j);//因为长度是递增的,所以枚举的长度中有k-j 层蛋糕满足条件 
			if(ans<sum){
				ans=sum;
				w1=w;
				l1=l;
			}
		}
	}
	printf("%lld
",ans);
	printf("%lld %lld
",l1,w1);
	return 0;
}

  

原文地址:https://www.cnblogs.com/cglongge/p/9407218.html