简单说一下题意:
给你 个数,任意组合得到 个坐标点,求最小矩形面积能够框住这 个点。
当时做的时候直接跪了…毫无思路…最后看了题解才懂
我们先将这 个数排序得到 ,然后考虑一下问题的转化:我们应该如何计算矩形的面积?
因为矩形是要求把这 个点框住的,所以稍微想一下不难得到:
于是我们将原问题这样转化:
给你 个数,把这 个数放在两个集合当中,每个集合的元素个数为 ,设这两个集合分别为 ,
求
接下来我们来讨论,如何分放集合。
考虑如果最大数 与最小数 如果在同一个集合 ,那么现在我们要求 。
考虑一下怎样的情况才会有 的情况出现。假设 在 中为 ,那么 在 中一定为 ,为什么呢?
如果 在 之间,那么 集合里面的元素个数就没有要求的 个了,不满足。
如果 在 之间,那么显然可以在满足元素个数为 的情况下使 最小。
所以在最大数
与最小数
如果在同一个集合
时,答案的值为:
那么还有一种情况就是最大数
与最小数
不在同一个集合当中,与上面类似的讨论不难得到最后的结果唯一:
所以我们最后的结果在上面两者之间取最小即可。
参考代码:
int main(){
LL I,J,K;
N=Read();
for(I=1;I<=2*N;I++){
A[I]=Read();
}
sort(A+1,A+1+2*N);
if(N==1){
puts("0");return 0;
}
Ans=(A[N]-A[1])*(A[2*N]-A[N+1]);
for(I=2;I<=N;I++){
Ans=min(Ans,(A[2*N]-A[1])*(A[I+N-1]-A[I]));
}
Write(Ans);
return 0;
}