输油管道问题
问题描述:
思路:确定输油主干道的纵坐标,因为是东西走向,用前面用到的选择问题求中位数也就是主干道的纵坐标,然后用到求出最小的总和`
以下是代码
//select代码注释在选择问题中给出了解释
#include <bits/stdc++.h>
int a[50];
int select(int left,int right,int k)
{
if( left >= right ) return a[left];
int x = a[left];
int i = left;
int j = right+1;
while( true )
{
do{
i++;
}while(a[i]<x);
do{
j--;
}while(a[j]>x);
if( i>=j ) break ;
std::swap(a[i],a[j]);
}
if( j-left+1 == k ) return x;
a[left] = a[j];
a[j] = x;
if( j-left+1 < k )
return select(j+1,right,k-j+left-1);
else
return select(left,j-1,k);
}
int main()
{
int x;
int y;
int n;
scanf("%d",&n);
for(int i=0; i<n; i++)
scanf("%d%d",&x,&a[i]);
y=select(0,n-1,n/2); //这里是求中位数
printf("主油管道的的纵坐标为:%d\n",y);
int min=0;
for(int i=0; i<n; i++)
{
min+=(int)fabs(a[i]-y);
}
printf("各输油管道到主管道的最小距离总和为:%d",min);
return 0;
}
以下是程序运行结果: