这段时间要沉迷刷题一段时间了,就让CSDN陪我一起吧!
一、题目大意
题很长,但意思很简单,首先给一个整数n,代表点的个数,然后给定2n个整数,为数组元素。要求用2n个数组元素组合出n个点的坐标,使坐标系中包围这n个点的矩形面积最小。
二、题目思路以及AC代码
这道题几乎10秒出思路,不过在一点小细节上卡了很长时间。
首先将这个题进行抽象,其实就是给定2*n个数,要求你将其分成两个部分,一个是x部分,一个是y部分,然后求x部分极差和y部分极差乘积的最小值。
一开始我想的是利用排序,将前n小的数分给x部分,后n小的数分给y部分,以为这样就是最小的,结果WA了,最后发现原来这样并不能保证最小,这样只能保证在不同时交换最大最小值的时候,是最小的。如果将排序后的后半部分中的a[n]和前半部分中的a[0]进行交换,那这个大小值就不确定了,因为前半部分的最大值换成了a[n],最小值换成了a[1],后半部分最大值还是a[2*n-1],最小值换成了a[0],这样乘积变大变小是无法确定的,所以这时还需在这里对比一下,求取最小值。
下面给出AC代码:
#include <iostream>
#include <algorithm>
#define MAXN 200010
using namespace std;
long long n;
long long a[MAXN];
int main()
{
cin >> n;
for (int i = 0; i < 2*n; i++) {
cin >> a[i];
}
sort(a, a + 2*n);
long long dx = a[n - 1] - a[0];
long long dy = a[2 * n - 1] - a[n];
long long ans = dx * dy;
for (int i = n; i < 2 * n; i++) {
ans = min(ans, (a[2 * n - 1] - a[0])*(a[i] - a[i - n + 1]));
}
cout << ans << endl;
return 0;
}
如果有问题,欢迎大家指正!!!