• 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 }
  • 相关阅读:
    生成一个四位数的随机验证码
    计算阶乘
    四种排序(冒泡、插入、递归、选择)
    Java基础面试被常问到知识点
    Qt中的坐标系统
    a message box to confirm the action
    点击按钮退出窗口
    为部件提供浮动提示信息
    在窗口标题栏的左上方显示图标
    PyQt5显示一个空白的窗口
  • 原文地址:https://www.cnblogs.com/jiu0821/p/4505480.html
Copyright © 2020-2023  润新知