题目大意:有 𝑛 个人想要坐车,线路可以抽象成一条数轴。 第
𝑖 个人想要从坐标 𝑠𝑖 坐到坐标 𝑡𝑖 。你的车从原点 0 出发,最终行驶到坐标 𝑚
。车上最多只能同时坐一个乘客,但你可以让乘客中途下车,只需保证最终将其送达他的目的地即可。在满足所有人的需求下,你行驶的最小总路程是多少呢?
考虑这个路程可以分为车上有人和车上没人,显然车上有人的话,其路程是一定的,无法更改
我们只好希望车上没人的路程尽量的小
所以我们对于每一个t,都希望找到一个全局最小的s,作为他的后继
并且需要把0与m放进去,其中0需要作为一个t,m需要作为一个s(可以这么想,我们到达第一个点,就是相当于从上一个终点过来的,而上一个终点就是0,m同理)
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| #include <bits/stdc++.h> #define int long long using namespace std;
const int N = 1e5 + 66;
inline int read() { int s(0), w(1); char ch = getchar(); while (ch < '0' || ch > '9'){if (ch == '-') w = -1; ch = getchar();} while (ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar(); return s * w; }
inline void put(int x) { if (! x) putchar('0'); if (x < 0) putchar('-'), x = -x; int num(0); char c[66]; while (x) c[++ num] = x % 10 + 48, x /= 10; while (num) putchar(c[num --]); return (void)(putchar('\n')); }
int n, m, res; int s[N], t[N];
signed main() { int i; n = read(), m = read(); for (i = 1; i <= n; ++ i) { s[i] = read(), t[i] = read(); res += abs(s[i] - t[i]); }
s[0] = m, t[0] = 0; sort(s, s + n + 1), sort(t, t + n + 1);
for (i = 0; i <= n; ++ i) res += abs(s[i] - t[i]);
put(res); return 0; }
|