1031 Order
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 538 Solved: 67
[ Submit][ Status][ Web Board]
Description
一天boss把新来的实习生叫到一起,让他们站成一排,并叫来了负责培训实习生的小明。
boss说:“小明,这么长时间,你应该对他们的能力有所了解了,按照他们的能力,给他们排下序吧,能力高站前面。”
小明心中已经有了一个顺序,但为了照顾人的自尊心,他是不会把人从前面拉倒后面的,只会让优秀的往前站。 比如原来的顺序是1,3,2. 小明想要的顺序是1,2,3. 最省事的方法就是让2站到3的前面了。
然而实习生人数比较多,小明想知道最少要几步才能排好序。
Input
第一行输入N( 1 <= N <= 1000),表示用例个数
每个用例两行,原来的序列,以及小明想要的序列(序列最长不超过100,每个人用1~100编号)。
Output
最少需要移动的次数
Sample Input
1
1 3 2
1 2 3
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,