説明
入力
サンプル入力
4
1 2 5 10
サンプル出力
------------------------------------------ ------ -------------------------------------------- ------ --------------------------------
問題分析 (以下のN人の速度をabcd...で表し、速い順に並べる)
n = 4の場合 (以下のN人の速度をabcdで表します... () は費やした時間を示します
スキーム [1] abcdab (b) past a (a) back
cd (d) past
b (b) back
ab(b) past
所要時間
: a 3b d
計画 [2] abcdad(d) past
ac (c) 過去
a (a) 戻る
ab (b) 過去
費やした時間
: 2a b c d
計算例
ここで、質問サンプル {1, 2, 5, 10}Plan [1] Time = 17Plan [2] Time = 19
をインポートします。プラン [1] を使用すると、最も時間がかかります。時間は 17
ですが、データを変更すると {1, 2, 2, 10}
スキーム [1] 時間 = 17
今回は、計画 [2] の時間が 16 で最も短くなります;
2 つの計画にかかる時間を概算すると、
計画 [1] ]: 2b
所要時間
決め手
は、最も速い a、2 番目に速い b、2 番目に遅い c であることがわかります。 2b と a c を比較して、どちらを使うかを選択する必要があります。最も時間がかからない解決策で十分です。
n > 4
関連チュートリアル: Java ビデオ チュートリアル
import java.util.Arrays; import java.util.Scanner; public class 过河 { static long time = 0L; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int m = sc.nextInt(); for (int i = 0; i < m; i++) { int n = sc.nextInt(); int[] A = new int[n]; for (int j = 0; j < n; j++) { A[j] = sc.nextInt(); } Arrays.sort(A); f(A); System.out.println(time); time = 0L; } } public static void f(int[] A) { if(A.length == 3) { time += A[0] + A[1] + A[2]; return; } if(A.length == 2) { time += A[1]; return; } if(A.length == 1) { time += A[0]; return; } if(A[0] + A[A.length - 2] < A[1] * 2) { time += 2 * A[0] + A[A.length - 2] + A[A.length - 1]; }else { time += A[0] + 2 * A[1] + A[A.length - 1]; } int[] B = Arrays.copyOfRange(A, 0, A.length - 2); f(B); } }
以上が川を渡るという古典的なアルゴリズム問題の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。