C语言程序设计经典例题:输油管道问题、集合划分问题、最少硬币问题、区间覆盖问题、子集和问题

网上有很多同类型的相关例题解法,即便会重复,我还是决定发一下,因为这些都是自己大一写的,也不存在抄袭问题,但当时学识尚浅,如有错误还请指正谅解。
输油管道问题
★问题描述:某石油公同计划建造一条由东向西的主输油管道。该管道要穿过一个有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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

輕塵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值