题解 CF1012A 【Photo of The Sky】

· · 题解

作为一个蒟蒻,\tt{CF}止步Div.2\;C

这个题主要考察思维,正解代码炒鸡短……

以下大部分搬运自官方题解

题目大意:

给你一个长度为2n的数组,将这个数组分为两个可重集,每个集合有n个元素,使得这两个集合的极差之积最小,输出这个最小值

题解:

假设输入的数组为a[2n],为了方便,我们把要分成的两个可重集叫做XY

首先肯定要sort一下,使得数组有序,方便操作(下文提到的数组都是有序的)

接下来就是分类讨论了:

最终的答案从这两种情况中取一个最小值就好了。

时间复杂度O(nlogn)(也就是排序的复杂度)

最后提醒一句:别忘了开\mathfrak{long\;long}

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int read(){
    int k=0; char c=getchar();
    for(;c<'0'||c>'9';) c=getchar();
    for(;c>='0'&&c<='9';c=getchar())
      k=(k<<3)+(k<<1)+c-48;
    return k;
}
ll a[100010<<1],ans;
int main(){
    int n=read();
    for(int i=1;i<=n<<1;i++) a[i]=read();
    sort(a+1,a+(n<<1)+1);
    ans=(a[n]-a[1])*(a[n<<1]-a[n+1]); //第二种情况
    for(int i=2;i<=n+1;i++)  //第一种情况
        ans=min((a[n<<1]-a[1])*(a[i+n-1]-a[i]),ans);
    cout<<ans;
    return 0;
}