zoukankan      html  css  js  c++  java
  • Codeforces Round #500 (Div. 2) C.Photo of The Sky

    题意:输入一个n,接下来输入一个长度为2*n的数组,代表n组坐标中的x,y,让你找出n组坐标,使得组成的矩形面积最小

    首先对数组进行枚举找出满足条件的最小矩形:

    ans=(a[n*2]-a[1])*(a[n+i-1]-a[i]),该等式为一条边最长另一条边最短的情况,乘号两边分别代表x的长度和y的长度,当一个数组中同一个数达到n个,也就使得a[n+i-1]-a[i]=0从而最小面积为0,而因为(a[n*2]-a[1])使得该边可以任意选取a(假设该边为x),另一条边(假设为y)则可以选择n+i-1到i上的元素,把问题可以转换成x轴选取n个元素与y轴选取n个元素,因为a[n*2]为最大的数,a[1]为最小的数,这使得无论数组有多么奇葩,都可以放在x轴上,我们再来看y轴,因为n+i-1-i=n-1,所以这些坐标都可以在矩形上

    同时不要忘记ans=1LL*(a[n]-a[1])*(a[n*2]-a[n+1]);的情况

    另外加一个read函数,否则大概率超时。。。。

    #include <bits/stdc++.h> 
    
    using namespace std;
    int read()
    {
        int x=0,f=1;char c=getchar();
        while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
        while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
        return x*f;
    }
    #define N 100010
    int n,a[N<<1];
    int main()
    {
        n=read();
        for (int i=1;i<=n*2;i++) a[i]=read();
        sort(a+1,a+n*2+1);
        long long ans=1ll*(a[n]-a[1])*(a[n*2]-a[n+1]);
        for (int i=2;i<=n;i++) ans=min(ans,1ll*(a[n*2]-a[1])*(a[n+i-1]-a[i]));
        cout<<ans;
        return 0;
    }
  • 相关阅读:
    win10 下安装 tesseract + tesserocr
    win 10 家庭中文版安装docker ,但是没有 Hyper-V , 这样一步搞定
    Pycharm 分屏
    cookie 和 session
    retrying 模块
    Pychram 运行程序在 run 窗口和 python console 窗口之间切换
    封装、继承、多态
    泛型、反射、注解
    多线程笔记
    多线程
  • 原文地址:https://www.cnblogs.com/Fy1999/p/9393713.html
Copyright © 2011-2022 走看看