题目链接:http://codeforces.com/contest/1130/problem/B
思路:
贪心题。定义结构体数组a,a[i].x[0],a[i].x[1]分别表示i出现的第一个下标和第二个下标。从i到i+1过程中,只有两种可能,即Sasha选择a[i+1].x[0]或Sasha选择a[i+1].x[1],仔细想一下,模拟一下,会发现选择其中需要步数最小的即可。详见代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 struct node{ 5 int x[2],k; 6 }a[100005]; 7 8 int n,p1,p2,tmp; 9 long long res; 10 11 int main(){ 12 scanf("%d",&n); 13 for(int i=1;i<=n;++i) 14 a[i].k=0; 15 for(int i=1;i<=2*n;++i){ 16 scanf("%d",&tmp); 17 a[tmp].x[a[tmp].k++]=i; 18 } 19 p1=p2=1; 20 for(int i=1;i<=n;++i){ 21 int tmp1=abs(a[i].x[0]-p1)+abs(a[i].x[1]-p2),tmp2=abs(a[i].x[0]-p2)+abs(a[i].x[1]-p1); 22 if(tmp1<tmp2) 23 res+=tmp1,p1=a[i].x[0],p2=a[i].x[1]; 24 else 25 res+=tmp2,p1=a[i].x[1],p2=a[i].x[0]; 26 } 27 printf("%lld ",res); 28 return 0; 29 }