景区中有2n个景点,坐标分别是1..2n,美丽值为1..n的景点各有两个。A,B两人想分别从1出发,
按照美丽值1…n的顺序访问景点,且他们都不会访问那些被对方访问过的景点(经过景点时可以选择访问,也可以选择不访问)。
问两个人最小的旅行线路距离和最小是多少。
思路:没啥营养的题目
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
ll n,a[N],f[N][2]; //f[i][0/1]表示游客0/1的坐标为i的的美丽值,策略是0/1两个游客都不能访问同一美丽值的景点
vector<int> v[N];
int main() {
std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin>>n; for (int i=0; i<2*n; i++) cin>>a[i];
for (int i=0; i<2*n; i++) v[a[i]].push_back(i);
memset(f,0x3f3f3f3f,sizeof f);
f[1][0]=f[1][1]=v[1][0]+v[1][1];
for (int i=2; i<=n; i++) {
ll ac=abs(v[i][0]-v[i-1][0]), bd=abs(v[i][1]-v[i-1][1]);
ll ad=abs(v[i][1]-v[i-1][0]), bc=abs(v[i][0]-v[i-1][1]);
f[i][0]=min(ac+bd,ad+bc)+f[i-1][0]; //玄学,这写f[i-1][1]也行
f[i][1]=min(ac+bd,ad+bc)+f[i-1][1];
}
cout<<min(f[n][0], f[n][1]);
return 0;
}