Codeforces Round #324 (Div. 2) E

这题贪心,考虑先放第一个,然后从第一个数在p中的位置, 不断的往前走,和在他后面的那些数组进行交换,因为这样交换可以提高最大的效率,就是说你花费了1但是使得两个点都朝他的木匾节点减少了1

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;
const int maxn=2000005;
int A[maxn],B[maxn],idx[maxn],D[maxn];
pair<int,int>P[maxn];
int main()
{
   int N;
   while(scanf("%d",&N)==1)
   {
        for(int i=1; i<=N; i++)
        {
            scanf("%d",&B[i]);
            idx[B[i]]=i;
        }
       for(int i=1; i<=N; i++)
        {
             scanf("%d",&D[i]);
             A[D[i]]=i;
        }
        int cost=0,num=0;
        for(int i=1; i<=N; i++)
        {
            int d=D[i];
            if(d==B[i])continue;
            int Loc=idx[d];
            for(int i=idx[d]-1; i>0;i--)
            {
                 int d1=B[i];
                 if( idx[d] == A[d] )break;
                 if(A[d1]>=Loc){
                     cost+=abs(idx[d1]-idx[d]);
                     swap(idx[d1],idx[d]);
                     P[num++]=make_pair(idx[d1],idx[d]);
                     swap(B[i],B[Loc]);
                     Loc=i;
                 }
            }
        }
        printf("%d
",cost);
        printf("%d
",num);
        for(int i=0 ; i<num; i++)
            printf("%d %d
",P[i].first,P[i].second);
   }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/Opaser/p/4867412.html