zoukankan      html  css  js  c++  java
  • CF1012A Photo of The Sky

    CF1012A Photo of The Sky

    (n) 个打乱的点的 (x, y) 轴坐标,现在告诉你这 (2 imes n) 个值,问最小的矩形面积能覆盖住n个点且矩形长和宽分别与 (x, y) 轴平行。

    (nleq10^5, 1leq x, yleq10^9)

    贪心


    先将 (a_i) 升序排序,方便接下来的操作

    设将这 (2 imes n) 个值分配为 ((x_i, y_i))

    (ans=min{max{x_i-x_j} imesmax{y_i-y_j}})

    根据小学奥数和一定差小积大,我们要最大化 (|max{x_i-x_j}-max{y_i-y_j}|)

    分类讨论两种情况:

    • 最小化 (max{x_i-x_j})

      (x={a_i|iin[1, n]})

    • 最大化 (max{x_i-x_j})

      此时 (max{x_i-x_j}=a_{2 imes n}-a_1)

      需要最大化 (max{y_i-y_j}) ,此时遍历一遍所有长度为 (n) 的连续区间即可

    时间复杂度 (O(nlog n))

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    typedef long long ll;
    const int maxn = 1e5 + 10;
    int n, a[maxn << 1];
    
    int main() {
      scanf("%d", &n);
      for (int i = 1; i <= n << 1; i++) {
        scanf("%d", a + i);
      }
      sort(a + 1, a + n + n + 1);
      ll ans = 1ll * (a[n] - a[1]) * (a[n + n] - a[n + 1]);
      for (int i = 1; i <= n; i++) {
        ans = min(ans, 1ll * (a[n + n] - a[1]) * (a[n + i] - a[i + 1]));
      }
      printf("%I64d", ans);
      return 0;
    }
    
  • 相关阅读:
    linux shell 小技能
    Jenkins 2.60.x 2种发送邮件方式
    Linux wget 批量下载
    日语阅读-2-如何看“何々的”的用法
    日语阅读-1-如何看ほう的用法
    [日本语]初级语法
    Python基础
    Python基础(10)
    Python基础(8)
    Python基础(7)
  • 原文地址:https://www.cnblogs.com/Juanzhang/p/10627894.html
Copyright © 2011-2022 走看看