Photo of The Sky 数学

13 篇文章 0 订阅

题意 给出2*n个 值 可以任意构成(x,y)的点 找出一种组合 使得一个矩形可以框住所有的点并且矩形最小

可以简化成把2*n个值分成一个X集合和一个Y集合

先把a数列排序

分两种情况 1.数列的最大值和最小值在一个集合中 例如在X集合中  此时矩形的一条边为(xmax-xmin)已确知 即已经排序的数列的a[2*n-1]-a[0]  Y的边的值应该由Y确定 因为要包含在矩形里 所以要选择连续的n个点作为Y集合  此时边为【a[i],a[i+n-1]】长度为

a[i+n-1]-a[i]  找出最小的a[i+n-1]-a[i]  并将这N个数放入Y集合  因为 X集合已经有最小最小值了 所以把 N个点放入Y集合 把其他的N个点(包括a[0],a[2*n-1])放入X对X边是没有影响的  此时矩形大小为   (a[2*n-1]-a[0])*min(a[i+n-1]-a[i])

                   2.数列的最大值和最小值不在一个集合中  此时设 X集合的最大值肯定要大于等于中间值a[n-1] Y集合的最小值肯定大于等于a[n] 此时矩形长度为 (a[n-1]-a[0])*(a[2*n-1]-a[n])

注意:要开Long Long

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[200010];
int main(){
int n;
while(scanf("%d",&n)==1){
    for(int i=0;i<n*2;i++){
        scanf("%I64d",&a[i]);
    }
      sort(a,a+n*2);
    long long ans=0;
    ans=(a[n-1]-a[0])*(a[2*n-1]-a[n]);
   for(int i=1;i<n;i++){
      //  cout<<ans<<endl;
    ans=min(ans,ll(-a[i]+a[n+i-1])*(a[2*n-1]-a[0]));
   }
   cout<<ans<<endl;

}
return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值