最短距离(排序)

Question:

★问题描述

L 参加了一场越野比赛,在比赛中选手需要到达指定的地点。比赛共有 n 个指定地点,
在一维坐标上分别表示为 x1, x2, ..., xn。比赛的目标是尽快依次到达其中 n-1 个指定地点。(所
选的 n-1 个地点以及访问的顺序由选手自行决定)L 最初在坐标位置 a,他想要知道如何选
择 n-1 个地点以及按怎样的顺序去访问能使得完成比赛的总距离尽可能短。他希望你能告诉
他最短的距离。

★数据输入

第一行包含两个整数 n 和 a (1 ≤ n ≤ 100 000, - 1 000 000 ≤ a ≤ 1 000 000) 表示指定点数以
及 L 的初始坐标。

第二行是 n 个整数 x1, x2, ..., xn ( - 1 000 000 ≤ xi ≤ 1 000 000) ,表示 n 个指定地点的坐标。

★数据输出

输出一个整数,表示 L 访问 n-1 个地点所要经过的最短距离。

输入文件示例 输出文件示例
3 10
1 7 12
7

Answer

  #include <math.h>  
#include <iostream>  
#include <algorithm>  
#include <cmath>  
using namespace std;  
  
int randPosition[2000000];  
  
int min(int a,int b)  
{  
    return a < b ? a : b;  
}  
  
int main()  
{  
    int inputNumber;  
    int position;  
  
    int rightAlwaysGoLength_deleteRight = 2147483647;   
    int leftAlwaysGoLength_deleteRight = 2147483647;  
    int leftThenRightLength_deleteRight = 2147483647;  
    int rightThenLeftLength_deleteRight = 2147483647;  
  
    int rightAlwaysGoLength_deleteLeft = 2147483647;  
    int leftAlwaysGoLength_deleteLeft = 2147483647;  
    int leftThenRightLength_deleteLeft = 2147483647;  
    int rightThenLeftLength_deleteLeft = 2147483647;  
  
    int minLength = 0;  
    int flagForN0 = 0;  
    cin >> inputNumber >> position;  
    for(int i=0;i<inputNumber;i++)  
    {  
        cin >> randPosition[i];  
    }  
    sort(randPosition, randPosition + inputNumber);  
  
    if(inputNumber == 1)  
    {  
        flagForN0 = 1;  
    }  
  
    //delete right  
      
    if(position <= randPosition[0])  //1 ---->  
    {  
        rightAlwaysGoLength_deleteRight = randPosition[inputNumber - 2] - position;  
    }  
    else if(position >= randPosition[inputNumber -2]) //2 <----  
    {  
        leftAlwaysGoLength_deleteRight = position - randPosition[0];  
    }  
    else  
    {  
        rightThenLeftLength_deleteRight = (randPosition[inputNumber - 2] - position) * 2 + (position - randPosition[0]); //--->then<----  
        leftThenRightLength_deleteRight = (position - randPosition[0]) * 2 + (randPosition[inputNumber - 2] - position); //<---then---->  
    }  
  
    //delete left  
    if (position <= randPosition[1])  //1 ---->  
    {  
        rightAlwaysGoLength_deleteLeft = randPosition[inputNumber - 1] - position;  
    }  
    else if (position >= randPosition[inputNumber - 1]) //2 <----  
    {  
        leftAlwaysGoLength_deleteLeft = position - randPosition[1];  
    }  
    else  
    {  
        rightThenLeftLength_deleteLeft = (randPosition[inputNumber - 1] - position) * 2 + (position - randPosition[1]); //--->then<----  
        leftThenRightLength_deleteLeft = (position - randPosition[1]) * 2 + (randPosition[inputNumber - 1] - position); //<---then---->  
    }  
  
  
    int min_DeleteLeft;  
    int min_DeleteRight;  
    min_DeleteRight = min(min(leftAlwaysGoLength_deleteRight, rightAlwaysGoLength_deleteRight), min(leftThenRightLength_deleteRight, rightThenLeftLength_deleteRight));  
    min_DeleteLeft = min(min(leftAlwaysGoLength_deleteLeft, rightAlwaysGoLength_deleteLeft), min(leftThenRightLength_deleteLeft, rightThenLeftLength_deleteLeft));  
  
    minLength = min_DeleteLeft > min_DeleteRight ? min_DeleteRight : min_DeleteLeft;  
      
    if (flagForN0 == 1)  
        cout << 0;  
    else cout << minLength << endl;  
  
    return 0;  
}  
posted @ 2017-09-16 16:05  考拉小无  阅读(614)  评论(0)    收藏  举报