输油管道问题

#include<iostream>
#include<algorithm>
using namespace std;
//输油管道问题
int main()
{
    int n;//油井的数量
    int x;//x坐标,读取后丢弃
    int a[1000];//y坐标
    cout<<"请输入油井个数:"<<endl;
    cin>>n;
    cout<<"请输入油井的x和y坐标,以空格分隔:"<<endl;
    for(int k=0;k<n;k++)
        cin>>x>>a[k];
        sort(a,a+n);//按升序排序
    //计算各油井到主管道之间的输油管道最小长度总和
    int min=0;
    for(int i=0;i<n;i++){
        min+=(int)abs(a[i]-a[n/2]);
    }
    cout<<"各油井到主管道之间的输油管道最小长度总和为:"<<endl;
    cout<<min<<endl;
}

 

#include<iostream>
#include<algorithm>
using namespace std;
//输油管道问题
int a[1024];
//采用分治策略找出第k小元素的算法
//在a[left:right]中选择第k小的元素
int select(int left,int right,int k){
//找到了第k小的元素
if(left>=right)return a[left];
int i=left;//从左到右的指针
int j=right+1;//从右到左的指针
//把最左边的元素作为分界数据
int pivot=a[left];
//把左侧>=pivot的元素与右侧<=pivot额元素交换
while(true){
    //在左侧寻找>=pivot的元素
    do{
        i=i+1;
    }while(a[i]<pivot);
    //在右侧寻找<=pivot的元素
    do{
        j=j-1;
    }while(a[j]>pivot);
    if(i>=j)break;//没有发现交换对象
    swap(a[i],a[j]);
}
if(j-left+1==k)return pivot;
a[left]=a[j];//存储pivot
a[j]=pivot;
if(j-left+1<k)
    //对一个段进行递归调用
    return select(j+1,right,k-j+left-1);
else return select(left,j-1,k);
}
int main()
{
    int n;//油井的数量
    int x;//x坐标,读取后丢弃
    cout<<"请输入油井个数:"<<endl;
    cin>>n;
    cout<<"请输入油井的x和y坐标,以空格分隔:"<<endl;
    for(int k=0;k<n;k++)
        cin>>x>>a[k];
        int y=select(0,n-1,n/2);//采用分治算法计算中位数
    //计算各油井到主管道之间的输油管道最小长度总和
    int min=0;
    for(int i=0;i<n;i++)
        min+=(int)abs(a[i]-y);
    cout<<"各油井到主管道之间的输油管道最小长度总和为:"<<endl;
    cout<<min<<endl;
}
发布了265 篇原创文章 · 获赞 215 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/kt1776133839/article/details/104338134