題目描述: 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提示:
解:注意身高相同時,小個移動最少次數的爲數組索引較小的,大個移動次數少的爲數組中索引較大的。 排序
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); } } }