链接:贪玩蓝题
题意: 给出 2n个数字,组成 n对坐标 ,要求:选出 2 对(x,y)
1.他们组成的矩形包含了其他的所有的点
2.这个矩形面积最小
问:该面积最小可以等于多少
题解:
由于要选出 2对 (x,y) 他们包含了所有坐标那么肯定是一个 x 坐标集合的 Max,Min,一个 y 坐标集合Max,Min
那么排序使得求解会方便很多
排序以后越相邻的相差越小
所以选择 1---n
n+1---2*n
如果你是这样做的你可以参考某一位大神给的数据:
4
1 1 2 3 3 3 4 11 ,有没有发现,可能会2个差的和一定最小,但是不一定乘积最大
那么有什么情况是 a+b > x+y
a*b < x*y
像这样:
1+6 > 2+4 2+10 > 8+3
1*6 < 2*4 2*10 < 3*8
就是存在有一像1,2这样小的值,即便有一个数很大有没有变得太大
那么得到 2点:
1. 相邻越近差值越小
2. 小*大 可能 < 中*中
那么我们就有了初步的做法
1.先定 答案 = (n-1)+(2*n-(n+1))
2.再枚举 ((n+i-1) - i)
枚举这个的时候,那么另一组的的边长 = Max - Min
= 2*n - 1
代码:
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define mst(a,b) memset(a,b,sizeof(a))
const int M = 200000 + 5;
long long a[M];
int main() {
int n;
scanf("%d",&n);
rep(i,1,2*n) scanf("%lld",&a[i]);
sort(a+1,a+2*n+1);
long long ans = (a[2*n] - a[n+1]) * (a[n] - a[1]);
rep(i,2,n) {
long long tmp = (a[2*n] - a[1]) * (a[n+i-1] - a[i]);
ans = min(ans,tmp);
}
printf("%lld\n",ans);
}