【9度OJ 1398】移動回数


タイトルの説明:
JOBDU傘下のJOBBALAは、個性的で親民的なIT会社として知られています.JOBBALAの設立50周年の日には、会社のCEOが社員全員の登山旅行を組織した.いつもの習慣では、ガイドは通常、身長が低い順から高い順に並ぶように観光客に要求していますが、今回のJOBBALAの人数が多すぎることを考えると、ソートに時間がかかります.そこで、ガイドさんは、JOBBALAのスタッフに勝手に並ぶように要求しましたが、キューの1つ目がキューの中で一番低く、キューの最後がキューの中で一番高いことを保証しなければなりません.例えば、キュー{1,4,3,2,2,5}は一致するキューであり、{1,4,2,3,2,5}も一致し、{2,1,2,3,4,5}は間違っている.すみません、任意の列については、最低2、2回交換しなければなりませんが、ガイドの要求に合うようにすることができますか?
入力:
複数のテストケースを入力します.各テストケースは2行です.
最初の行は、人数を表す整数n(2<=n<=200)を含み、次の行は、n個の整数a 1,a 2,......an(1<=ai<=200)を含み、n個の従業員の初期の配列を表す.
出力:
各テストケースに対応して、ガイドの要求に従って、出力は最低2、2交換の回数を必要とします.
サンプル入力:
2
89 88
4
55 88 1 2

サンプル出力:
1
3

ヒント:
ケース2では、最低3回移動する必要があります:(5588 1 2)->(551 88 2)->(1 5588 2)->(1 552 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);
		}
	}

}