网上有很多同类型的相关例题解法,即便会重复,我还是决定发一下,因为这些都是自己大一写的,也不存在抄袭问题,但当时学识尚浅,如有错误还请指正谅解。
输油管道问题
★问题描述:某石油公同计划建造一条由东向西的主输油管道。该管道要穿过一个有n口油井的油田。从每口油井都要有一条输油管道沿最短路径(或南或北)与主管道相连。如果给定n口油井的位置,即它们的x坐标(东西向)和y坐标(南北向) ,应如何确定主管道的最优位置,即使各油井到主管道之间的输油管道长度总和最小的位置?证明可在线性时间内确定主管道的最优位置。
★算法设计:给定n口油井的位置,计算各油井到主管道之间的输油管道最小长度总和。
★数据输入:由文件input.txt提供输人数据。文件的第1行是油井数n,1≤ n ≤10000。接下来n行是油井的位置,每行2个整数x和y,-10000 ≤ x,y ≤ 10000。
★结果输出:将计算结果输出到文件output.txt。文件的第1行中的数是各油井到主管道之间的输油管道最小长度总和。
输入文件示例(input) 输出文件示例 (output)
input.txt | output.txt |
---|---|
5 | 6 |
1 2 | |
2 2 | |
1 3 | |
3 -2 |
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define N 10001
void swap(int *, int *);
void quicksort(int *, int, int); //函数声明
void swap(int *p, int *q) //交换函数
{
int temp;
temp = *p;
*p = *q;
*q = temp;
return;
}
void quicksort(int *a, int left, int right)//快速排序法函数
{
int i = left;
int j = right;
int T = a[left]; //定义一个基准
if (left >= right)
{
return ;
}
while (left < right)
{
while (left < right && T <= a[right]) //如果右侧数值比基准大,则将右侧箭头前移
{
--right;
}
if (T > a[right])
{
swap(&a[left], &a[right]); //当找到右侧比括基准小的数簓时骸,将左侧数与右侧数交换数值
++right;
}
while (left < right && T >= a[left]) //左侧数小于基准时则不进行操作,并将箭头向右移动
{
++left;
}
if (T < a[left])
{
swap(&a[left], &a[right]); //当找到左侧小于基准的数时则将其与右侧箭头所指向数值进行交换
--right;
}
}
quicksort(a, i, left-1); //递归的分别对左侧及右侧的数进行上述操作
quicksort(a, left+1, j);
}
int main()
{
FILE *fp,*op;
int i,j,n=0,mid,s=0;
int a[N],b[N];
if((fp=fopen("input.txt","r"))==NULL) //打开数据输入文件
{
printf("cannot open this file\n");
exit (0);
}
rewind(fp);
fscanf(fp,"%d",&n);
for(i=0;i<n;i++)
{
fscanf(fp,"%d",&a[i]);
fscanf(fp,"%d",&b[i]);
}//将文件中的数据读入数组中
fclose(fp);
quicksort(b,0,n-1);
if(n