经典算法问题之过河详解
本篇文章的主要内容是关于经典算法问题之过河的详解,感兴趣的朋友可以了解一下,希望对你有所帮助。
描述
一群N人希望用一条船过河,这条船最多只能载两个人。因此,必须安排某种穿梭安排,才能来回划船,以便所有人都能过关。每个人都有不同的划船速度;一对选手的速度取决于速度较慢的人的速度。你的工作是确定一个策略,尽量减少这些人的过河时间。
输入
输入的第一行包含一个整数T(1<=T<=20),测试用例数。接下来是T个案例。每个案例的第一行包含N,第二行包含N个整数,给出每个人过河的时间。每个案例前面都有一个空白行。不会有超过1000人,没有人需要超过100秒的跨越。
输出量
对于每个测试用例,打印一行,其中包含所有N个人过河所需的总秒数。
样本输入
1
4
1 2 5 10
样本输出
17
------------------------------------------------------------------------------------------------------------------------------
问题分析
(以下N人速度分别用abcd…表示,且按速度升序排序)
- 当n= 1时,time则为a
- 当n= 2时,time则为b
- 当n= 3时,time则为a+b+c(a与任意一个人过河,a再回来,再和剩下的人过河)
- 当n>= 4 时,问题就复杂很多,因为任意两人过河,再在过了河中其中一个再回来有很多情况,我们这里需要进行分析
观察题目我们可以发现过河中有两个最为重要的点
方案【1】过河的两个人,花费时间是由最长的人决定
针对这一点,我们可以把最慢d的和次慢c的放一起,这样次慢的时间c就被忽略。
方案【2】回来的一个人,花费时间只由他一个人决定
针对这一点,我们可以让最快的a把其他人一一送过去,再由最快的a把船送回来将上面的方案实现
当n = 4时(以下N人速度分别用abcd…表示,且按速度升序排序)()内表示花费时间
方案【1】abcd
ab(b)过去
a (a)回来
cd(d)过去
b(b)回来
ab(b)过去
所花费时间:a+3b+d方案【2】abcd
ad(d)过去
a(a)回来
ac(c)过去
a(a)回来
ab(b)过去
所花费时间:2a+b+c+d计算样例
现在我们导入题目样例{1,2,5,10}
方案【1】时间 = 17
方案【2】时间 = 19
所以用方案【1】花费时间最短,时间为17但如果我们修改一下数据{1,2,2,10}
方案【1】时间 = 17
方案【2】时间 = 16
这次却是方案【2】花费的时间最短,时间为16;如果我们将两个方案的所花费时间约一下则
方案【1】:2b
方案【2】:a+c
可以看出所花费的时间 决定性因素 在于最快的a和次快的b和次慢的c,我们只需要将2b和a+c进行比较,选择花费时间最小的方案即可。当n > 4 时我们可以表示为用最快的前两个人运送最慢的后两个人便可,运送完人数就减少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); } }
Salin selepas log masukAtas ialah kandungan terperinci 经典算法问题之过河详解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Panduan Nombor Sempurna di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor Perfect dalam Java?, contoh dengan pelaksanaan kod.

Panduan untuk Weka di Jawa. Di sini kita membincangkan Pengenalan, cara menggunakan weka java, jenis platform, dan kelebihan dengan contoh.

Panduan untuk Nombor Smith di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor smith di Jawa? contoh dengan pelaksanaan kod.

Dalam artikel ini, kami telah menyimpan Soalan Temuduga Spring Java yang paling banyak ditanya dengan jawapan terperinci mereka. Supaya anda boleh memecahkan temuduga.

Java 8 memperkenalkan API Stream, menyediakan cara yang kuat dan ekspresif untuk memproses koleksi data. Walau bagaimanapun, soalan biasa apabila menggunakan aliran adalah: bagaimana untuk memecahkan atau kembali dari operasi foreach? Gelung tradisional membolehkan gangguan awal atau pulangan, tetapi kaedah Foreach Stream tidak menyokong secara langsung kaedah ini. Artikel ini akan menerangkan sebab -sebab dan meneroka kaedah alternatif untuk melaksanakan penamatan pramatang dalam sistem pemprosesan aliran. Bacaan Lanjut: Penambahbaikan API Java Stream Memahami aliran aliran Kaedah Foreach adalah operasi terminal yang melakukan satu operasi pada setiap elemen dalam aliran. Niat reka bentuknya adalah

Panduan untuk TimeStamp to Date di Java. Di sini kita juga membincangkan pengenalan dan cara menukar cap waktu kepada tarikh dalam java bersama-sama dengan contoh.

Kapsul adalah angka geometri tiga dimensi, terdiri daripada silinder dan hemisfera di kedua-dua hujungnya. Jumlah kapsul boleh dikira dengan menambahkan isipadu silinder dan jumlah hemisfera di kedua -dua hujungnya. Tutorial ini akan membincangkan cara mengira jumlah kapsul yang diberikan dalam Java menggunakan kaedah yang berbeza. Formula volum kapsul Formula untuk jumlah kapsul adalah seperti berikut: Kelantangan kapsul = isipadu isipadu silinder Dua jumlah hemisfera dalam, R: Radius hemisfera. H: Ketinggian silinder (tidak termasuk hemisfera). Contoh 1 masukkan Jejari = 5 unit Ketinggian = 10 unit Output Jilid = 1570.8 Unit padu menjelaskan Kirakan kelantangan menggunakan formula: Kelantangan = π × r2 × h (4

Spring Boot memudahkan penciptaan aplikasi Java yang mantap, berskala, dan siap pengeluaran, merevolusi pembangunan Java. Pendekatan "Konvensyen Lebih Konfigurasi", yang wujud pada ekosistem musim bunga, meminimumkan persediaan manual, Allo
