CF1713A Traveling Salesman Problem 题解
题目链接:CF1713 Traveling Salesman Problem
题意:$t$ 组数据,每组数据给定 $n$ 个在坐标轴上的点 $(x_i,y_i)$ ,求最小的路径满足
- 起点和终点均为 $(0,0)$
- 每一步只能走到 $(x+1,y),~(x-1,y),~(x,y+1),~(x,y-1)$四者中的一个
例如下图
$1 \le t \le 100,~1\le n \le 100,~-100 \le x_i,y_i \le 100$
考虑四个方向上距离 $(0,0)$ 最远的所构成的合法矩形(满足走法的矩形)
对矩形进行一定的伸缩,一定能走完所有的点,并且一定是最优的,
例如题目里给出的这个图,如果 $(0,1)$ 有个点,也是可以走到的
显然, $(0,0)$ 也可以走到,然后就没了
时间复杂度 $O(tn)$
代码:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iomanip>
#include <random>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
#define N (int)()
int n;
void solve()
{
cin >> n;
int minx=0,miny=0,maxx=0,maxy=0;
for(int i=1,x,y; i<=n; i++)
{
cin >> x >> y;
minx=min(x,minx);
maxx=max(x,maxx);
miny=min(y,miny);
maxy=max(y,maxy);
}
cout << 2*(maxx+maxy-minx-miny) << '\n';
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
// freopen("check.in","r",stdin);
// freopen("check.out","w",stdout);
int Q; cin >> Q;
while(Q--) solve();
return 0;
}