南邮-1206-输油管道问题
2014-12-04 15:08
197 查看
输油管道问题
时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte总提交 : 155 测试通过 : 81
比赛描述
某石油公司计划建造一条由东向西的主输油管道。该管道要穿过一个有n 口油井的油田。从每口油井都要有一条输油管道沿最短路经(或南或北)与主管道相连。如果给定n口油井的位置,即它们的x坐标(东西向)和y坐标(南北向),应如何确定主管道的最优位置,即使各油井到主管道之间的输油管道长度总和最小的位置?证明可在线性时间内确定主管道的最优位置。
给定n 口油井的位置,编程计算各油井到主管道之间的输油管道最小长度总和。
输入
输入的第1 行是油井数n,1<=n<=10000。接下来n行是油井的位置,每行2个整数x和y,-10000<=x,y<=10000。
输出
输出的第1行中的数是油井到主管道之间的输油管道最小长度总和。
样例输入
5
1 2
2 2
1 3
3 -2
3 3
样例输出
6
详细的介绍参见《算法设计与分析》:输油管道问题
#include <iostream> #include <math.h> using namespace std; int Partition(int* a,int start,int end) { int i,j,x,temp; i=start; j=end+1; x=a[start]; while(1) { while(i<end&&a[++i]<x); while(j>start&&a[--j]>=x); if(i>=j) break; temp=a[i]; a[i]=a[j]; a[j]=temp; } a[start]=a[j]; a[j]=x; return j; } int RandomizeSelect(int* a,int start,int end,int k) { int PartitionPos,position; if(start==end) return a[start]; PartitionPos=Partition(a,start,end); position=PartitionPos-start+1; if(k<=position) return RandomizeSelect(a,start,PartitionPos,k); else return RandomizeSelect(a,PartitionPos+1,end,k-position); } int main() { int i,n,sum,middle; int* a; cin>>n; a=new int ; for(i=0;i<n;i++) cin>>a[i]>>a[i]; middle=RandomizeSelect(a,0,n-1,(n+1)/2); for(i=0,sum=0;i<n;i++) sum+=abs(a[i]-middle); cout<<sum<<endl; delete []a; a=0; return 0; }
相关文章推荐
- 南邮 OJ 1206 输油管道问题
- [递归与分治算法][BOJ]1031-输油管道问题
- 输油管道问题
- 南邮-2045(最大子序列和的问题)
- 南邮NOJ鸡兔同笼问题
- 01背包问题 南邮NOJ 1308
- 南邮NOJ开灯问题
- 输油管道问题
- 南邮-1207-众数问题
- 南邮-2040-比赛成绩查询问题II
- 输油管道问题
- 1948-南邮-参赛选手信息更新问题
- 南邮-1214-排序的字典序问题
- 输油管道问题
- 南邮-1949-比赛成绩排序问题
- 输油管道问题
- 输油管道问题
- 【mysql】1206 SQLSTATE: HY000 (ER_LOCK_TABLE_FULL) 问题
- 南邮-1204-金币阵列问题
- 开灯问题 南邮NOJ 1589 (另一种解法)