zoukankan      html  css  js  c++  java
  • Codeforces Round #324 (Div. 2) E. Anton and Ira 贪心

    E. Anton and Ira

    Time Limit: 1 Sec  

    Memory Limit: 256 MB

    题目连接

    http://codeforces.com/contest/584/problem/E

    Description

    Anton loves transforming one permutation into another one by swapping elements for money, and Ira doesn't like paying for stupid games. Help them obtain the required permutation by paying as little money as possible.

    More formally, we have two permutations, p and s of numbers from 1 to n. We can swap pi and pj, by paying |i - j| coins for it. Find and print the smallest number of coins required to obtain permutation s from permutation p. Also print the sequence of swap operations at which we obtain a solution.

    Input

    The first line contains a single number n (1 ≤ n ≤ 2000) — the length of the permutations.

    The second line contains a sequence of n numbers from 1 to n — permutation p. Each number from 1 to n occurs exactly once in this line.

    The third line contains a sequence of n numbers from 1 to n — permutation s. Each number from 1 to n occurs once in this line.


    Output

    In the first line print the minimum number of coins that you need to spend to transform permutation p into permutation s.

    In the second line print number k (0 ≤ k ≤ 2·106) — the number of operations needed to get the solution.

    In the next k lines print the operations. Each line must contain two numbers i and j (1 ≤ i, j ≤ n, i ≠ j), which means that you need to swap pi and pj.

    It is guaranteed that the solution exists.

    Sample Input

    4
    4 2 1 3
    3 2 4 1

    Sample Output

    3
    2
    4 3
    3 1

    HINT

    题意

    给你两个数组,你要求让第一个数组变成第二个数组,你可以进行交换操作

    每次交换操作的代价是abs(i-j)

    然后让你把方案输出出来

    题解:

    贪心题,你其实可以把每次交换想成线段一样的东西

    你只要把这些线段压成一条线段就好了

    ------->
         <-------------
    ----------------->
    ----------->
      <---------------

    直接暴力交换那些和自己有重叠的线段端点就好了

    代码:

    #include<iostream>
    #include<math.h>
    #include<string.h>
    #include<vector>
    #include<queue>
    #include<stdio.h>
    using namespace std;
    
    int a[2005];
    int b[2005];
    int c[2005];
    int d[2005];
    int ans1[520005];
    int ans2[520005];
    int main()
    {
        int n;
        int tot = 0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(int i=1;i<=n;i++)
            scanf("%d",&b[i]),c[b[i]]=i;
        int ans= 0;
        for(int i=1;i<=n;i++)
        {
            if(a[i]!=b[i]){
            int k = -1;
            for(int j=i+1;j<=n;j++)
                if(a[j]==b[i])
                {
                    k = j;
                    break;
                }
            while(k!=i)
            {
                for(int j = i;j<k;j++)
                {
                    if(c[a[j]]>=k)
                    {
                        ans += fabs(k-j);
                        swap(k,j);
                        swap(a[k],a[j]);
                        ans1[tot]=k;
                        ans2[tot]=j;
                        tot++;
                        break;
                    }
                }
            }
            }
        }
        cout<<ans<<endl;
        cout<<tot<<endl;
        for(int i=0;i<tot;i++)
            printf("%d %d
    ",ans1[i],ans2[i]);
    }
  • 相关阅读:
    iOS开发——高级篇——iOS抽屉效果实现原理
    iOS开发——高级篇——FMDB 数据库简单使用
    iOS开发——高级篇——多线程dispatch_apply
    iOS开发——基础篇——get和post请求的区别
    iOS开发——高级篇——线程同步、线程依赖、线程组
    谈谈程序员最讨厌做的事
    iOS开发——高级篇——iOS 项目的目录结构
    iOS开发——高级篇——Runtime实际应用
    程序猿如何“智斗”产品经理
    iOS开发——基础篇——iOS开发 Xcode8中遇到的问题及改动
  • 原文地址:https://www.cnblogs.com/qscqesze/p/4858438.html
Copyright © 2011-2022 走看看