输油管道问题(分治策略)

输油管道问题

问题描述:
在这里插入图片描述
思路:确定输油主干道的纵坐标,因为是东西走向,用前面用到的选择问题求中位数也就是主干道的纵坐标,然后用到在这里插入图片描述求出最小的总和`
以下是代码

 //select代码注释在选择问题中给出了解释 
 #include <bits/stdc++.h>
 
  int a[50];
  
  int select(int left,int right,int k)
  {
    if( left >= right )    return a[left];
    
    int x = a[left];
    
    int i = left;
    
    int j = right+1;
    
    while( true )
	{
        do{
            i++;
         }while(a[i]<x);
         
        do{
             j--;
         }while(a[j]>x);
         
        if( i>=j )   break ;
        std::swap(a[i],a[j]);
     }
     
     if( j-left+1 == k )    return x;
     
     a[left] = a[j];
     
     a[j] = x;
     
     if( j-left+1 < k )
         return select(j+1,right,k-j+left-1);
    else
         return select(left,j-1,k); 
   }
 
 	int  main()
	{
		int x;
		int y;
		int n;
		scanf("%d",&n);
		
		for(int i=0; i<n; i++)
		scanf("%d%d",&x,&a[i]);
		
		y=select(0,n-1,n/2);  //这里是求中位数
		 
		printf("主油管道的的纵坐标为:%d\n",y);
		 
	    int min=0;
	    
	    for(int i=0; i<n; i++)
	    {
	    	min+=(int)fabs(a[i]-y);
		}
		printf("各输油管道到主管道的最小距离总和为:%d",min);
		
		return 0;
	}
	 

以下是程序运行结果:
在这里插入图片描述

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值