题目描述: 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); } } }