最短距离(排序)
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;
}
浙公网安备 33010602011771号