Photo of The Sky 数学

题意 给出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
using namespace std;
typedef long long ll;
ll a[200010];
int main(){
int n;
while(scanf("%d",&n)==1){
    for(int i=0;i

 

你可能感兴趣的:(ACM,math)