CUMT 1031 Order

1031  Order

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 538  Solved: 67
[ Submit][ Status][ Web Board]

Description

一天boss把新来的实习生叫到一起,让他们站成一排,并叫来了负责培训实习生的小明。

boss说:“小明,这么长时间,你应该对他们的能力有所了解了,按照他们的能力,给他们排下序吧,能力高站前面。”

小明心中已经有了一个顺序,但为了照顾人的自尊心,他是不会把人从前面拉倒后面的,只会让优秀的往前站。 比如原来的顺序是132. 小明想要的顺序是123. 最省事的方法就是让2站到3的前面了。

然而实习生人数比较多,小明想知道最少要几步才能排好序。

Input

第一行输入N( 1 <= N <= 1000),表示用例个数

每个用例两行,原来的序列,以及小明想要的序列(序列最长不超过100,每个人用1~100编号)。

Output

最少需要移动的次数

Sample Input

1
1 3 2
1 2 3

Sample Output

1

HINT

刚开始用Java实现的,这样是考虑到因为里面人数的个数是不确定的,如果C++用字符串是实现到时候还要转换成数组,而Java有专门的字符串转换函数,比较方便,整体思路就是将目标数组与原数组从第一个数开始往后比较,如果出现目标数组元素位置和原数组元素位置不对应的情况,就比较该元素在原数组中的位置相对于目标数组来说是靠前还是靠后,靠前则不移动,靠后则将其移动到目标数组中元素的当前位置,如此循环,两个数组元素位置一致,贴代码:

import java.util.Scanner;

/**
 * Created by yun on 2016/10/20.
 */
public class Main {
    public static int index(int n,int b[],int count){       //找出数组元素在数组中的位置
        for(int i=0;i<count;i++)
        {
            if(b[i]==n)return i;
        }
        return n;
    }
    public static void move(int b[],int tag1,int tag2)       //将数组移动,tag1为所要移动的元素位置,tag2为要插入的位置,从后往前移动
    { 
        int a = b[tag1];
        for(int i=tag1;i>tag2;i--)
        {
            b[i]=b[i-1];
        }
        b[tag2] =a;
    }
    public static boolean infind(int b1[],int b2[],int count)      //判断两个数组是否相等
    {
        for(int i=0;i<count;i++)
        {
            if(b1[i]!=b2[i])return false;
        }
        return true;
    }
    public static void main(String []args){
        Scanner input = new Scanner(System.in);
        int q = input.nextInt();
        for(int i=0;i<q;i++)
        {
            if(i==0)
            {
                String ss = input.nextLine();        //消除回车
            }
            String s = input.nextLine();
            String y = input.nextLine();
            String [] arr1 = s.split(" ");
            String [] arr2 = y.split(" ");
            int [] a = new int[arr1.length];
            int [] b = new int[arr2.length];
            for(int j=0;j<arr1.length;j++)
            {
                a[j] = Integer.parseInt(arr1[j]);
                b[j] = Integer.parseInt(arr2[j]);
            }
            int count = arr1.length;
            int countt = count;
            int tag1,tag2,jishu=0;
            for(int j=0;j<countt;j++) {
                for (int r = 0; r < count; r++) {
                    tag1 = index(b[r], a, count);
                    tag2 = r;
                    if (tag1 > tag2) {
                        move(a,tag1,tag2);
                        jishu++;
                        if (infind(a, b, count)) break;
                    }
                }
                if (infind(a, b, count)) break;
            }
            System.out.println(jishu);
        }
    }
}

时间复杂度比较大,有同学的时间复杂度可以做到O(n),看了一下具体实现过程,相比这种,确实巧妙,不过也不想编了 TAT,



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值