首页 > 代码库 > 金块问题

金块问题

金块问题

题目:老板有一袋金块(共 n 块,n 是 2 的幂( n ≥ 2 )),最优秀的雇员得到其中最重的一块,最差的雇员得到其中最轻的一块。假设有一台比较重量的仪器,希望用最少的比较次数找出最重和最轻的金块。并对自己的程序进行复杂性分析。

import java.util.Scanner;

public class Main {

	private static void minmax(int i, int j, int[] gold, int[] result) {

		int[] ltemp = new int[2];
		int[] rtemp = new int[2];

		if (i == j - 1) {
			if (gold[i] <= gold[j]) {
				result[0] = gold[i];
				result[1] = gold[j];
			} else {
				result[0] = gold[j];
				result[1] = gold[i];
			}
		} else {
			int mid = (i + j) / 2;
			minmax(i, mid, gold, ltemp);
			minmax(mid + 1, j, gold, rtemp);

			if (ltemp[0] <= rtemp[0]) {
				result[0] = ltemp[0];
			} else {
				result[0] = rtemp[0];
			}

			if (ltemp[1] >= rtemp[1]) {
				result[1] = ltemp[1];
			} else {
				result[1] = rtemp[1];
			}

		}

	}

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);

		while (scanner.hasNext()) {
			int n = scanner.nextInt();

			int[] gold = new int[n];
			for (int i = 0; i < n; i++) {
				gold[i] = scanner.nextInt();
			}

			int[] result = new int[2];
			minmax(0, n - 1, gold, result);

			System.out.println("min: " + result[0]);
			System.out.println("max: " + result[1]);
		}
		scanner.close();
	}
}