【九度OJ1398】移動次數

題目描述: java

衆所周知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個員工初始的排列。 spa

輸出:

對應每一個測試案例,按照導遊的要求,輸出最少須要兩兩交換的次數。 code

樣例輸入:
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);
		}
	}

}
相關文章
相關標籤/搜索