7-6 铺设油井管道

本文介绍了一种解决石油公司铺设油井管道问题的算法,目标是确定主管道位置,使得所有油井到主管道的支线管道长度总和最小。算法基于快速选择,复杂度为O(n),适用于大规模数据。输入包括油井数量和坐标,输出为最小长度总和。代码实现了该算法,并给出了测试用例的输入和输出。
摘要由CSDN通过智能技术生成

7-6 铺设油井管道

某石油公司有n口油井,为方便输送石油,计划修建输油管道。根据设计要求,水平方向有一条主管道,每口油井修一条垂直方向的支线管道通向主管道。请设计一种算法确定主管道的位置,使得所有油井到主管道之间的支线管道长度的总和最小。提示:复杂度为O(n)才能通过所有测试用例。
在这里插入图片描述
输入格式:
每个输入文件为一个测试用例,每个文件的第一行给出一个正整数n(1≤n≤1000000),表示油井数量,从第二行起的n行数据,表示每口油井的位置,每行包含以空格分隔的两个整数,分别表示每口油井的横坐标x(−10000≤x≤10000)和纵坐标y(−10000≤y≤10000)。

输出格式:
输出各油井到主管道之间的支管道最小长度总和。

输入样例:
在这里给出一组输入。例如:

4
-1 1
2 2
5 -1
-3 7

输出样例:

9

代码:

#include <stdio.h>
#include <stdlib.h>
#include<math.h>
int n;
int a[1001010];
int k;
int mid;
void fid(int left,int right)
{
    int temp=a[left];
    int i=left;
    int j=right;
    if(i>j)
        return;
    while(i<j)
    {
        while(i<j&&a[j]>temp)
            j--;
        a[i]=a[j];
        while(i<j&&a[i]<=temp)
            i++;
        a[j]=a[i];
    }
    a[i]=temp;
    if(i==k)
        mid=a[i];
    else if(i>k)
        fid(left,i-1);
    else
        fid(i+1,right);
    return ;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int x;
        scanf("%d%d",&x,&a[i]);
    }
    if(n%2==0)
        k=n/2;
    else
        k=n/2+1;
    fid(1,n);
    long long sum=0;
    for(int i=1;i<=n;i++)
        sum+=abs(a[i]-mid);
    printf("%lld",sum);
    return 0;
}

202206222114三

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baibai___

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值