46
Description
某石油公司计划建造一条由东向西的主输油管道。该管道要穿过一个有n 口油井的油田。从每口油井都要有一条输油管道沿最短路经(或南或北)与主管道相连。如果给定n 口油井的位置,即它们的x 坐标(东西向)和y 坐标(南北向),应如何确定主管道的最优位置, 即使各油井到主管道之间的输油管道长度总和最小的位置?给定n 口油井的位置,编程计算各油井到主管道之间的输油管道最小长度总和。
/* #include<iostream> #include<algorithm> #include<cmath> using namespace std; int a[10000]; int main() { int n,q,p,c; while(cin>>n) { int sum=0; for(int i=0;i<n;i++) { cin>>q>>p; a[i]=p; } sort(a,a+n); c=a[n/2]; for(int i=0;i<n;i++) sum+=abs(c-a[i]); cout<<sum<<endl; } return 0; } */ /* Sample Input 5 1 2 3 5 3 7 3 4 2 7 Sample Output 8 */ #include<iostream> #include<stdio.h> #include<cmath> using namespace std; int main() { int n; while(scanf("%d",&n)==1&&n>=1) { int data[n]; int tempt; for(int i=0;i<n;i++) { scanf("%d %d",&tempt,&data[i]); } for(int i=0;i<n;i++) { int tmp=data[i]; for(int j=5;j>i;j--) { if(tmp>data[j]) { data[i]=data[j]; data[j]=tmp; tmp=data[i]; } } } for(int i=0;i<n;i++) { cout<<data[i]<<endl; } int sum=0; int mid; if(n%2==0) mid=(data[n/2]+data[n/2-1])/2; else mid=data[n/2+1]; printf("mid:%d\n",mid); for(int i=0;i<n;i++) { sum=sum+abs(mid-data[i]); printf("abs:%d\n",abs(mid-data[i])); } printf("%f",sum); } }