输油管道问题

相关代码:

#include <stdio.h>
#include <stdlib.h>
#include<math.h>
#include<time.h>
#define T 300
int partition(int arr[], int low, int high){
    int key;
    key = arr[low];
    while(low<high){
        while(low <high && arr[high]>= key )
            high--;
        if(low<high)
            arr[low++] = arr[high];
        while( low<high && arr[low]<=key )
            low++;
        if(low<high)
            arr[high--] = arr[low];
    }
    arr[low] = key;
    return low;
}
void quick_sort(int arr[], int start, int end, int mid){
    int pos;
    if (start<end){
        pos = partition(arr, start, end);
        if(pos==mid) return;//如果直接求到中位数就返回 
        if(pos>mid) quick_sort(arr,start,pos-1 ,mid);//如果当前确定好的位置在mid右边,则放弃左边 
        if(pos<mid) quick_sort(arr,pos+1,end,mid);//如果当前确定好的位置在mid左边,则放弃右边 
    }
    return;
}
int main(void){
    int i,M;
    int arr[T];
    printf("请输入油井的总个数,不要超过300\n"); 
 	scanf("%d", &M); 
    srand(time(0));  
  
 	printf("随机产生油井的横纵坐标\n"); 
 for(i = 0; i < M; i ++)  
 {  
  arr[i]=(int)rand()%20000-10000; 
  printf("第%d个油井的横纵坐标分别为 %d , %d\n", i,(int)rand()%20000-10000, arr[i]); 
 }  
 
  printf("排完序后油井的纵坐标的序列\n"); 
    int mid=M/2;
    quick_sort(arr,0,M-1,mid);
    printf("\n 排序后 \n");
    for(i=0; i<M; i++)
        printf("%d\t", arr[i]);
    printf ("\n");
    printf("所需要的结果是:  %d",arr[mid]);
    system("pause");
    return 0;
}
解析:输油管道问题只和油井的y坐标有关,和x坐标没有关系。而对于最外侧的两个油井,主干道设计在两者之间是最节省材料的,两者之间无论是那个地方结果都一样。然后用同样的方式分析次外侧的两个油井,依次类推。结果主干道的位置应该就是中位数的位置。我们需要找到所有y坐标的中位数。结合快速排序法的思想,但是每次排序后抛弃不带有中位数的一边,就可以再线性时间内找到中位数。找到中位数后问题就会迎刃而解!
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值