【思维题】CodeForce 1012A Photo of The Sky

版权声明:Johnson https://blog.csdn.net/m0_38055352/article/details/90944030

这段时间要沉迷刷题一段时间了,就让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;
}

如果有问题,欢迎大家指正!!!

猜你喜欢

转载自blog.csdn.net/m0_38055352/article/details/90944030
sky