b_51_最小旅行路线(列举所有可能)

景区中有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;
}
原文地址:https://www.cnblogs.com/wdt1/p/13904489.html