zoukankan      html  css  js  c++  java
  • p1691 输油管道问题

    描述
    某石油公司计划建造一条由东向西的主输油管道。该管道要穿过一个有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
    Copy
    样例输出1
    6

    思路

    贪心,因为题中所说的是要在每个井口在南北向架管道连接到总管道,故不需要考虑x坐标。对于y坐标贪心的思想就是取该数列的有序数列的中位数进行比较,得到的总长度即为最短。

    代码

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 int comp(const void * p1,const void * p2);
     4 
     5 int main() {
     6     int n;
     7     scanf("%d",&n);
     8     int a[10005];
     9     int i;
    10     for (i=0;i<n;i++){
    11         scanf("%*d %d",a+i);
    12     }
    13     qsort(a,n,sizeof(int),comp);
    14     int mid=a[n/2],result=0;
    15     for (i=0;i<n;i++){
    16         result+=abs(a[i]-mid);
    17     }
    18     printf("%d",result);
    19     return 0;
    20 }
    21 
    22 int comp(const void * p1,const void * p2){
    23     const int * a1=(const int  * )p1;
    24     const int * a2=(const int  * )p2;
    25     if(*a1<*a2) return -1;
    26     else if (*a1==*a2) return 0;
    27     else return 1;
    28 }
  • 相关阅读:
    Lock
    Semaphore
    Exchanger
    CyclicBarrier
    [O]SQL SERVER下有序GUID和无序GUID作为主键&聚集索引的性能表现
    十个面向对象设计原则
    DB-Engines Ranking
    【转】计算机网络总结
    【转】常见的Web实时消息交互方式和SignalR
    【转】软件质量之道:SourceMonitor
  • 原文地址:https://www.cnblogs.com/archemiya/p/8512124.html
Copyright © 2011-2022 走看看