【洛谷OJ】P1862—输油管道问题

mac2024-06-21  46

题目背景 听说最近石油危机 所以想到了这题 题目描述 某石油公司计划建造一条由东向西的主要输油管道。该管道要穿过一个有n口油井的油田。从每口油井都要有一条输油管道沿最短路径(或南或北)与主管道相连。如果给定n口油井的位置,及它们的x坐标(东西向)和y坐标(南北向),应如何确定主管道的最优位置,即使各油井到主管道之间的输油管道长度总和最小的位置?证明可规定时间内确定主管道的最优位置。 输入格式 第一行是油井数n(1<=n<=10000) 接下来n行是油井的位置,每行2个整数x和y(-10000<=x,y<=10000) 输出格式 只有一行 是油井到主管道之间的输油管道最小长度总和 输入输出样例 输入 5 1 2 2 2 1 3 3 -2 3 3 输出 6 ————————————————————————————————————— 这道题涉及一个数学概念——中位数 先用sort把y坐标排序,再取中位数,也就是取n/2+1。 在这道题中,x坐标没啥用(据伟大的数学理论:两点之间,线段最短) 因为……我相信这样绝对不是最短的吧↓ 先来看看 度娘对 中位数的定义↓ 中位数是按顺序排列的一组数据中居于中间位置的数,即在这组数据中,有一半的数据比他大,有一半的数据比他小

如果有一口油井,那么 可能也许应该 肯定是越近越好。如果有两口油井,肯定是设在两油井中间区域(包括两油井)比较好。

那n口油井不就是(1+)2+2+2+2+2+2+2……

中位数不就是那个中间区域的数吗(゚ー゚)?(灵魂大拷问)

多说无益,放程序:

#include<iostream> #include<cstring> #include<string> #include<algorithm> #include<sstream> using namespace std; int main(){ int i,a[100001]={0},n,m,len=0; cin>>n; for(i=1;i<=n;i++) cin>>a[i](x)>>a[i](y); //x坐标无用,理由如上 sort(a+1,a+n+1); //排序 m=a[n/2+1];//中位数 for(i=1;i<=n;i++) len=len+abs(a[i]-m); cout<<len; }

相似题型:P1889 士兵站队(y坐标处理方式基本相同,x坐标有点麻烦)

最新回复(0)