P1862 输油管道问题

P1862 输油管道问题

题目背景

听说最近石油危机

所以想到了这题

题目描述

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

输入输出格式

输入格式:

第一行是油井数n(1<=n<=10000)

接下来n行是油井的位置,每行2个整数x和y(-10000<=x,y<=10000)

输出格式:

只有一行

是油井到主管道之间的输油管道最小长度总和

输入输出样例

输入样例#1:
5
1 2
2 2
1 3
3 -2
3 3
输出样例#1:
6

这条输油管道肯定是在中间的一个位置比较好,我们就让它在中间好了。
如果n为奇数,说明建在中间的那一条管道一定是所要求的,让它是就好了,n为偶数的话,在中间的两条管道之间的任意一个位置都行,让它在两条之间
我们把n个点排序,求出中位数即可
 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstdlib>
 5 using namespace std;
 6 int x[10100],y[10100],n,m,ans;
 7 
 8 int main()
 9 {
10     scanf("%d",&n);
11     for (int i=1; i<=n; ++i)
12     {
13         scanf("%d%d",&x[i],&y[i]);
14     }
15     sort(y+1,y+n+1);
16     if (n%2==0) m = (y[n/2]+y[n/2+1])/2;
17     else m = y[n/2+1];
18     for (int i=1; i<=n; ++i)
19         ans += abs(m-y[i]);
20     printf("%d",ans);
21     return 0;
22 }
 
原文地址:https://www.cnblogs.com/mjtcn/p/7116759.html