• acoj-1735 输油管道 【中位数】


    题目链接:http://acdream.info/problem?pid=1735

    输油管道

    Time Limit: 2000/1000MS (Java/Others) Memory Limit: 262144/131072KB (Java/Others)

    Problem Description

    平面上有n个油井,现在要建立一条主干线,用来把所有的油井产出的原油都输送出去,主干线是平行于x轴的一条直线,每个油井通过一条支线把原油输送到主干线上,现在给定n个油井在平面上的坐标,那么应该把主干线建在什么地方才能让所有的支干线的总长度最小呢?

    Input

    首先一个正整数n,接下来n行每行两个整数,代表n个油井在平面上的位置。n和坐标都是小于等于1000000的正整数。

    Output

    输出总的支干线长度的最小值,每个结果占一行。

    Sample Input

    2
    0 0
    10 10

    Sample Output

    10




    解题思路:取y值中位数,总干线建到中位数那口井上,总支干线长度和最小。这道题目求中位数,不需要排序,可以利用快排原理进行部分搜取就可以求出中位数了。
    代码:
     1 #include <fstream>
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cmath>
     5 #include <cstdlib>
     6 
     7 using namespace std;
     8 
     9 const int nn=1000005;
    10 int a[nn],n,n2,ans;
    11 long long cnt;
    12 
    13 int quick_partition(int i,int j);
    14 void quick_sort(int s,int t);
    15 
    16 int main(){
    17     //freopen("D:\input.in","r",stdin);
    18     //freopen("D:\output.out","w",stdout);
    19     while(~scanf("%d",&n)){
    20         n2=(n+1)>>1;
    21         for(int i=1;i<=n;i++)   scanf("%*d%d",&a[i]);
    22         quick_sort(1,n);
    23         cnt=0;
    24         for(int i=1;i<=n;i++) cnt+=(long long)abs(a[i]-ans);
    25         printf("%lld
    ",cnt);
    26     }
    27     return 0;
    28 }
    29 int quick_partition(int i,int j){
    30     a[0]=a[i];
    31     while(i<j){
    32         while(i<j&&a[j]>=a[0])  j--;
    33         if(i<j) a[i]=a[j],i++;
    34         while(i<j&&a[i]<=a[0])  i++;
    35         if(i<j) a[j]=a[i],j--;
    36     }
    37     a[i]=a[0];
    38     return i;
    39 }
    40 void quick_sort(int s,int t){
    41     if(s<t){
    42         int tmp=quick_partition(s,t);
    43         if(tmp==n2){
    44             ans=a[tmp];
    45         }else if(tmp<n2){
    46             quick_sort(tmp+1,t);
    47         }else{
    48             quick_sort(s,tmp-1);
    49         }
    50     }else if(s==t)
    51         ans=a[s];
    52 }
  • 相关阅读:
    [原]减小VC6编译生成的exe文件的大小
    [原]可用代码
    [原]BlogTemplate
    [原]Excel VBA数据校验
    Favorite
    [原]隐藏cnblogs侧边栏
    [原]Skills
    UI现在就升级到Windows7
    redis 笔记
    1 Two Sum(LeetCode HOT 100)
  • 原文地址:https://www.cnblogs.com/jiu0821/p/4505480.html
Copyright © 2020-2023  润新知