codeforces Photo of The Sky

XLacon發表於2018-09-12

題目連結:http://codeforces.com/contest/1013/problem/C
題意:給你2*n 個整數,要求你把這2*n個數分為兩組,一組為x座標,一組為y座標,每組n個數。任你選一種組合方式,讓其組成n個點,使得包含所有xy座標表示的點的矩形(邊與座標軸平行)的最小面積。輸出最小面積
分析:對於此題,不要一頭扎進怎麼組合中,跳出來進行思考。
要求能包含所有點的最小矩形面積,我們就必須確定矩形的長和寬的大小。我們可以把所有的座標進行排序,對於矩形的邊長,一種考慮方式是使所有的邊的點靠的越進越好,所以就是
(a[n]-a[1])*(a[2*n]-a[n+1]) 另外一種情況是:最大和最小作為邊,然後找其中間對應點差值最小的作為邊。
從網上找到三張圖,能夠很形象的說明這個問題:

從小到大進行排列:
這裡寫圖片描述

情況1:
這裡寫圖片描述

情況2:
這裡寫圖片描述


#include<bits/stdc++.h>

using namespace std;

const int maxn=1e6+10;

long long a[maxn];

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n*2;i++){
        scanf("%lld",&a[i]);
    }
    sort(a,a+n*2);
    long long ans=(a[n-1]-a[0])*(a[n*2-1]-a[n]);
    for(int i=1;i<n;i++){
        ans=min(ans,(a[i+n-1]-a[i])*(a[n*2-1]-a[0]));
    }
    printf("%lld\n",ans);
    return 0;
}

相關文章