Codeforces 1013C Photo of The Sky

简单说一下题意:

给你 2 n 个数,任意组合得到 n 个坐标点,求最小矩形面积能够框住这 n 个点。

当时做的时候直接跪了…毫无思路…最后看了题解才懂

我们先将这 2 n 个数排序得到 a 1 , a 2 . . . a 2 n ,然后考虑一下问题的转化:我们应该如何计算矩形的面积?

因为矩形是要求把这 n 个点框住的,所以稍微想一下不难得到: S = ( m a x ( x ) m i n ( x ) ) ( m a x ( y ) m i n ( y ) )

于是我们将原问题这样转化:

给你 2 n 个数,把这 2 n 个数放在两个集合当中,每个集合的元素个数为 n ,设这两个集合分别为 X , Y
m i n ( ( X m a x X m i n ) ( Y m a x Y m i n ) )

接下来我们来讨论,如何分放集合。

考虑如果最大数 a 2 n 与最小数 a 1 如果在同一个集合 X ,那么现在我们要求 m i n ( Y m a x Y m i n )

考虑一下怎样的情况才会有 m i n ( Y m a x Y m i n ) 的情况出现。假设 Y m i n a 中为 a i ,那么 Y m a x a 中一定为 a i + n 1 ,为什么呢?

如果 Y m a x a i + 1 > a i + n 2 之间,那么 Y 集合里面的元素个数就没有要求的 n 个了,不满足。

如果 Y m a x a i + n > a 2 n 1 之间,那么显然可以在满足元素个数为 n 的情况下使 Y m a x 最小。

所以在最大数 a 2 n 与最小数 a 1 如果在同一个集合 X 时,答案的值为:

A n s = m i n ( a [ 2 n ] a [ 1 ] ) ( a [ i + n 1 ] a [ i ] ) 2 i n

那么还有一种情况就是最大数 a 2 n 与最小数 a 1 不在同一个集合当中,与上面类似的讨论不难得到最后的结果唯一:

A n s = ( a [ 2 n ] a [ n + 1 ] ) ( a [ n ] a [ 1 ] )

所以我们最后的结果在上面两者之间取最小即可。

参考代码:

int main(){
    LL I,J,K;
    N=Read();
    for(I=1;I<=2*N;I++){
        A[I]=Read();
    }   
    sort(A+1,A+1+2*N);
    if(N==1){
        puts("0");return 0;
    }
    Ans=(A[N]-A[1])*(A[2*N]-A[N+1]);
    for(I=2;I<=N;I++){
        Ans=min(Ans,(A[2*N]-A[1])*(A[I+N-1]-A[I]));
    }
    Write(Ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yanzhenhuai/article/details/81301718