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

链接:贪玩蓝题

题意: 给出 2n个数字,组成 n对坐标 ,要求:选出 2 对(x,y)
              1.他们组成的矩形包含了其他的所有的点
              2.这个矩形面积最小
              问:该面积最小可以等于多少

题解:

            由于要选出 2对 (x,y) 他们包含了所有坐标那么肯定是一个 x 坐标集合的 Max,Min,一个 y 坐标集合Max,Min

            那么排序使得求解会方便很多

            排序以后越相邻的相差越小
            所以选择   1---n
                          n+1---2*n 

            如果你是这样做的你可以参考某一位大神给的数据:

             4

             1 1 2 3 3 3 4 11 ,有没有发现,可能会2个差的和一定最小,但是不一定乘积最大 
             那么有什么情况是 a+b > x+y
                                           a*b <  x*y 
             像这样:             
                     1+6 > 2+4    2+10 > 8+3
                     1*6 < 2*4      2*10 < 3*8
            就是存在有一像1,2这样小的值,即便有一个数很大有没有变得太大
    
            那么得到 2点:
            1. 相邻越近差值越小
            2. 小*大 可能 < 中*中
    
              那么我们就有了初步的做法
              1.先定 答案 = (n-1)+(2*n-(n+1))
              2.再枚举 ((n+i-1) - i)
                             枚举这个的时候,那么另一组的的边长 = Max - Min
                                                                                           = 2*n - 1 

代码:


#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define mst(a,b)   memset(a,b,sizeof(a))
const int M = 200000 + 5;

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



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值