Codeforces Round #500 (Div. 2) C Photo of The Sky

Posted lyfoi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #500 (Div. 2) C Photo of The Sky相关的知识,希望对你有一定的参考价值。

翻译

给你(2N)个数字,你可以任意排列,让你排成(N)个坐标,问你包含这(N)个坐标的矩形大小的最小值。

思路

明确了求的是最小值!找到一个面积最小长方形使得全部点都包含。

本题的精华可以说是:极差

技术分享图片

然后我们看一下上面的图片,既然都包含,那么满足啥?我们先讨论最大值和最小值包含在

  • 我们就让点一与点二是全部能构成点中的极差最大的点(要是有比他大的你怎么包含)?

  • 然后,我们确定了长,不过宽不必为极差最。那么我下面讲一下为啥。

因为我们只要将输入的数排个序,以(N)为界,左边为横坐标,右边为纵坐标。这样我们只要随便找2个点(位于(N)的两侧),然后只要把比宽长的数作为横坐标,短或等于的作为纵坐标就可以啦(因为你的纵坐标在(N)的右边,对了别忘了你排顺序了哦)!

还有一种情况,那就是:最大值会在长里,最小值会在宽里,这样我们需要让最大值尽可能的小,最小值尽可能的大,由于排序,不就是(Easy)了吗?

于是我们可以总结出做法:先找一个基准数作为最小值(基准数为第二个情况的结果),然后确定长为最大值,枚举宽,更新答案

一定要开long long

用到了一些数学知识,我也不会,好不容易搞懂的,看不懂也没关系。

Code

#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
long long n,a[1000001];
int main()
{
    cin>>n;n*=2;
    for (int i=1; i<=n; i++)
        cin>>a[i];
    sort(a+1,a+n+1);
    long long ans=(a[n/2]-a[1])*(a[n]-a[n/2+1]);//先找到一个基准数,也是第二个情况的结果
    for (int i=2; i<=n/2+1; i++)//枚举并更新答案
        ans=min(ans,(a[i+n/2-1]-a[i])*(a[n]-a[1]));
    cout<<ans;
}

以上是关于Codeforces Round #500 (Div. 2) C Photo of The Sky的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #500 (Div. 2) BC

Codeforces Round#500 Div.2 翻车记

Codeforces Round 500 (Div. 2)

Codeforces Round #500 (Div. 2) 游记

Codeforces Round #500 (Div.1)

Codeforces Round #500 (Div. 2) ABC