• Vijos P1691 输油管道问题【中位数+排序】


    背景

    想念car的GF,car就出了道水题!

    描述

    某石油公司计划建造一条由东向西的主输油管道。该管道要穿过一个有n 口油井的油田。从每口油井都要有一条输油管道沿最短路经(或南或北)与主管道相连。如果给定n口油井的位置,即它们的x 坐标(东西向)和y 坐标(南北向),应如何确定主管道的最优位置,即使各油井到主管道之间的输油管道长度总和最小的位置?

    编程任务:
    给定n 口油井的位置,编程计算各油井到主管道之间的输油管道最小长度总和.

    格式

    输入格式

    输入第1行是油井数n,1≤n≤10000。

    接下来n行是油井的位置,每行2个整数x和y,-10000≤x,y≤10000。

    输出格式

    输出第1行中的数是油井到主管道之间的输油管道最小长度总和。

    样例1

    样例输入1

    5
    1 2
    2 2
    1 3 
    3 -2
    3 3
    

    样例输出1

    6
    

    限制

    各个测试点1s

    提示

    各个测试点1s

    来源

    经典算法



    问题链接Vijos P1691 输油管道问题

    问题分析

    这是一个最优化问题,可以通过计算中位数来解决。

    需要了解和掌握中位数的概念,可以通过百度百科查找“中位数”。

    程序说明

    使用C++的STL的排序功能是方便的,需要注意的是要重载<运算符。

    题记:(略)


    参考链接:(略)


    AC的C++程序如下:

    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    const int N = 10000;
    struct _node {
        int x, y;
        bool operator < (const _node &p) const {
                    return y < p.y;
                }
    } point[N];
    
    int main()
    {
        int n;
    
        cin >> n;
        for(int i=0; i<n; i++)
            cin >> point[i].x >> point[i].y;
    
        sort(point, point + n);
    
        int ans = 0, median;
        if(n % 2 == 1)
            median = point[n / 2].y;
        else
            median = (point[n / 2 - 1].y + point[n / 2].y) / 2;
        for(int i=0; i<n; i++)
            ans += abs(median - point[i].y);
    
        cout << ans << endl;
    
        return 0;
    }





  • 相关阅读:
    REST
    Bootstrap
    深入浅出聊聊企业级API网关
    Message Queue
    pyspark
    贝叶斯解读
    Leetcode#95 Unique Binary Search Trees II
    Leetcode#24 Swap Nodes in Pairs
    Leetcode#147 Insertion Sort List
    Leetcode#98 Validate Binary Search Tree
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563748.html
Copyright © 2020-2023  润新知