cf-Round542-Div2-B(贪心)

题目链接: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 }
原文地址:https://www.cnblogs.com/FrankChen831X/p/10432109.html