ACdream - 1735:输油管道

时间:2023-02-13 11:14:21

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

Problem Description

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

ACdream - 1735:输油管道

Input

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

Output

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

Sample Input

2

0 0

10 10

Sample Output

10

Source

第九届北京化工大学程序设计竞赛

Manager

rihkddd


ACdream - 1735:输油管道

当n为奇数时,显然当主干线在中间点2点时支线距离和最小,为x1+x2

ACdream - 1735:输油管道

n为偶数时,主干线放在2点或3点时和放在2点,3点之间是距离和是相同的,所以用奇数的先找中间点的方法在偶数的情况下同样适用。

所以这道题的关键是找出来处于中间的一个点

ps:不要忘了数据范围,用int会wa,要改成long long。

#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
struct node{
long long x,y;
}a[1000000+10];
int cmp(node u,node v)
{
return u.y<v.y;
}
int main()
{
long long n,sum=0,i;
scanf("%lld",&n);
for(i=0;i<n;i++) scanf("%lld%lld",&a[i].x,&a[i].y);
sort(a,a+n,cmp);
long long mid=a[n/2].y;
for(i=0;i<n;i++)
{
sum+=abs(a[i].y-mid);
}
printf("%lld\n",sum);
return 0;
}