1. 程式人生 > >Codeforces Round #500 (Div. 2) C Photo of The Sky

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

技術 long long 為我 順序 ostream long 矩形 fonts otg

翻譯

給你\(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