【九度OJ1398】移动次数

题目描述:

众所周知JOBDU旗下的JOBBALA公司是一家 以个性、亲民著称的IT公司。在JOBBALA公司成立50周年的日子里,公司CEO组织全体员工登山旅游。按照往常的习惯,导游通常要求游客按照身高从 低到高的顺序排好,但是考虑这次JOBBALA人数太多,排序很耗时间。因此,导游想了想,要求JOBBALA的员工可以随便排,但是必须保证队列的第一 个是队列中最矮的,队列的最后一个是队列中最高的。例如:队列 { 1, 4, 3, 2, 2, 5} 就是符合的队列,{1, 4, 2, 3, 2, 5}也符合,而{2, 1, 2, 3, 4, 5}就是错的。请问对于任意的队列,最少要两两交换多少次,可以让其符合导游的要求?

输入:

输入有多组测试案例,每个测试案例为2行。

第一行包括一个整数n(2<=n<=200)表示人数,接下来一行包括n个整数a1, a2, …… an (1<=ai<=200) 表示n个员工初始的排列。

输出:

对应每个测试案例,按照导游的要求,输出最少需要两两交换的次数。

样例输入:
2
89 88
4
55 88 1 2
样例输出:
1
3
提示:
案例2中,最少需要移动三次:(55 88 1 2) -> (55 1 88 2) -> (1 55 88 2) -> (1 55 2 88)

解:注意身高相同时,小个移动最少次数的为数组索引较小的,大个移动次数少的为数组中索引较大的。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;

/**
 * 移动次数 19时52分50秒
 * 
 * @author aqia358
 * 
 * 20时06分27秒
 */
public class Main {

	public void move(int[] a) {
		int minPos = 0;
		int maxPos = a.length - 1;
		int min = a[minPos];
		int max = a[maxPos];
		for (int i = 0; i < a.length; i++) {
			if (min > a[i]) {
				min = a[i];
				minPos = i;
			}
			if (max <= a[i]) {
				max = a[i];
				maxPos = i;
			}
		}
		if (minPos < maxPos) {
			System.out.println(minPos + a.length - 1 - maxPos);
		} else {
			System.out.println(minPos + a.length - 1 - maxPos - 1);
		}
	}

	public static void main(String[] args) throws IOException {
		Main m = new Main();
		StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
		while(st.nextToken() != StreamTokenizer.TT_EOF){
			int n = (int)st.nval;
			int[] array = new int[n];
			for(int i = 0; i < n; i++){
				st.nextToken();
				array[i] = (int) st.nval;
			}
			m.move(array);
		}
	}

}









你可能感兴趣的:(java,移动次数,九度OJ1398)