ホームページ Java &#&チュートリアル 川を渡るという古典的なアルゴリズム問題の詳細な説明

川を渡るという古典的なアルゴリズム問題の詳細な説明

Apr 30, 2019 pm 03:26 PM
java アルゴリズム

#この記事の主な内容は、川を渡るという古典的なアルゴリズム問題の詳細な説明です。興味のあるお友達は、さらに詳しくお役に立てれば幸いです。

説明

N 人のグループがボートで川を渡りたいと考えています。このボートには最大 2 人しか乗れません。したがって、全員が横断できるように、往復に漕ぐための何らかのシャトルの手配を行う必要があります。漕ぐ速度は人それぞれ異なり、ペアのランナーの速度は遅い人の速度に依存します。あなたの仕事は、これらの人々が川を渡るのにかかる時間を最小限に抑える戦略を決定することです。


入力

入力の最初の行には、テスト ケースの数を表す整数 T (1出力
各テスト ケースについて、N 人全員が川を渡るのにかかった合計秒数を含む行を出力します。


サンプル入力

1

4
1 2 5 10

サンプル出力

17

------------------------------------------ ------ -------------------------------------------- ------ --------------------------------

問題分析 (以下のN人の速度をabcd...で表し、速い順に並べる)

#n= 1のとき、時間はa
  1. n= 2 のとき、時間は b
  2. n= 3 のとき、時間は a b c (a は誰かと川を渡り、a は戻ってきて、残りの人たちと川を渡る) )
  3. n>= 4 の場合、2 人が川を渡った場合、そのうちの 1 人が川を渡って戻ってくる状況が多くあるため、問題はさらに複雑になります。ここで分析する必要があります。
  4. 質問を観察すると、川を渡るには 2 つの最も重要なポイントがあることがわかります。
  5. スキーム [1] 川を渡る 2 人の場合、費やした時間は最も長い人によって決まります。このうち、最も遅い時間 d と 2 番目に遅い時間 c を組み合わせることができ、2 番目に遅い時間 c は無視されます。
    案[2] 戻ってくる人の時間はその人だけで決まる
    そこで、一番早いaが他の人を1人ずつ送り、一番早いaに引き継がせてもいいでしょう。ボートを送り返す


  6. 上記の解決策を実現します

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

a(a) 戻る

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] の時間が 16 で最も短くなります;

2 つの計画にかかる時間を概算すると、
計画 [1] ]: 2b

plan [2]: a c

所要時間
決め手
は、最も速い a、2 番目に速い b、2 番目に遅い c であることがわかります。 2b と a c を比較して、どちらを使うかを選択する必要があります。最も時間がかからない解決策で十分です。
n > 4

の場合、早い人 2 人で遅い 2 人を輸送すると表現でき、輸送後の人数は 2 人減ります。

関連チュートリアル: Java ビデオ チュートリアル

以下は AC コードです (参考のみ)

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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプ Java での日付までのタイムスタンプ Aug 30, 2024 pm 04:28 PM

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルの量を見つけるためのJavaプログラム カプセルの量を見つけるためのJavaプログラム Feb 07, 2025 am 11:37 AM

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Feb 07, 2025 pm 12:11 PM

Spring Bootは、Java開発に革命をもたらす堅牢でスケーラブルな、生産対応のJavaアプリケーションの作成を簡素化します。 スプリングエコシステムに固有の「構成に関する慣習」アプローチは、手動のセットアップを最小化します。

See all articles