CF2121A Letter Home
CF2121A Letter Home - 洛谷
题目描述
已知一个长度为 n 的数组 A 和一个整数 s。(保证数组 A 中元素不相同)
起初,你在数轴上的位置 s,每一步你可以向左或向右移动一个单位长度。请你求出在整个移动过程中,将数组 A 中的每个位置至少访问一次的最小移动步数。
请注意,初始位置 s 也被视为已访问。
输入格式
每个测试用例由 T 测试数据组成。
第一行包含一个整数 T(1≤T≤1000)。
每个测试用例的第一行包含两个整数 n 和 s(1≤n≤10,1≤s≤100),第二行包含 n 个整数 ai(1≤ai≤100)。
保证数组 A 升序。
输出格式
对于每个测试用例,输出满足要求的最小移动步数。
输入输出样例
输入 #1
12
1 1
1
1 2
1
1 1
2
2 1
2 3
2 1
2 3
2 2
1 3
2 3
1 2
3 1
1 2 3
3 2
1 3 4
3 3
1 2 3
4 3
1 2 3 10
5 5
1 2 3 6 7
6 6
1 2 3 9 10 11
输出 #1
0
1
1
2
3
2
4
2
11
8
15
说明 / 提示
用例 1:不需要执行任何步骤。
用例 2:可以采取以下路径:2→1,步数为 1。
用例 3:可以采取以下路径:1→2,步数为 1。
用例 5:可以采取以下路径:2→1→2→3,步数为 3。
思路:
题目给出的s,是数轴上的坐标。数组a是给的每一个位置的坐标。所以我们要特判s是否在l~r的范围。画数轴就可以。
代码:
#include<bits/stdc++.h>
using namespace std;
int T;
int main(void)
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> T;while(T--){int n,s;cin >> n >> s;vector <int> a(n+1);for(int i = 1 ; i <= n ; i ++)cin >> a[i];int L = a[1],R = a[n];int steps;if(s >= L && s <= R){steps = (R - L) + min(s - L, R - s);}else if(s < L){steps = R - s;}else if (s > R){steps = s - L;}cout << steps << '\n';}return 0;}