题目:https://codeforces.com/problemset/problem/1130/B
分析:由于在每个点买蛋糕是相互独立的,所以我们只要求出每一步的最小值就行,这样最后就是最小值。
所以转移就是:
int d1 = abs(G[i][0] - G[i - 1][0]) + abs(G[i][1] - G[i - 1][1]);
int d2 = abs(G[i][0] - G[i - 1][1]) + abs(G[i][1] - G[i - 1][0]);
f[i] = f[i - 1] + min(d1,d2);
用vector来存图,最后要加进两个0;
因为任何一个人他可以走到两个相同size 的tier的任意一个,所以就只要分别求出到两个的最小值就行。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
const int INF = 0x3f3f3f3f;
vector<long long>G[maxn];
int main()
{
int n;
while(cin >> n)
{
int x;
for(int i = 0;i < n * 2;i ++)
{
cin >> x;
G[x].push_back(i);
}
G[0].push_back(0);
G[0].push_back(0);
long long f[maxn];
f[0] = 0;
for(int i = 1;i <= n;i ++)
{
int d1 = abs(G[i][0] - G[i - 1][0]) + abs(G[i][1] - G[i - 1][1]);
int d2 = abs(G[i][0] - G[i - 1][1]) + abs(G[i][1] - G[i - 1][0]);
f[i] = f[i - 1] + min(d1,d2);
}
cout << f[n] << endl;
}
return 0;
}