[CF1713A Traveling Salesman Problem] 题解
水一篇题解
由于每个箱子要么在 x x x 轴上,要么在 y y y 轴上,而又得从原点开始,回到原点上,所以最优策略是:从原点开始,先走到 x x x 正半轴的最远端,再回到原点,再到 x x x 负半轴的最远端,再回到原点,再到 y y y 的正半轴…
所以答案是每个半轴到原点的最长距离之和的 2 2 2 倍
下面贴出核心代码
int x_min = 0/* $x$ 负半轴*/, x_max = 0/* $x$ 正半轴*/;
int y_min = 0/* $y$ 负半轴*/, y_max = 0/* $y$ 正半轴*/;
for (int i = 0; i < n; i++) {
int x, y; cin >> x >> y;
if (x == 0)//如果在 $y$ 轴上
y_min = min(y, y_min), y_max = max(y, y_max);
if (y == 0)//如果在 $x$ 轴上
x_min = min(x, x_min), x_max = max(x, x_max);
}
cout << 2 * (x_max - x_min + y_max - y_min) << endl;