過河問題
過河問題
時間限製:1000 ms | 內存限製:65535 KB
難度:5
- 描述
-
在漆黑的夜裏,N位旅行者來到了一座狹窄而且沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,N個人一共隻帶了一隻手電筒,而橋窄得隻夠讓兩個人同時過。如果各自單獨過橋的話,N人所需要的時間已知;而如果兩人同時過橋,所需要的時間就是走得比較慢的那個人單獨行動時所需的時間。問題是,如何設計一個方案,讓這N人盡快過橋。
- 輸入
- 第一行是一個整數T(1<=T<=20)表示測試數據的組數
每組測試數據的第一行是一個整數N(1<=N<=1000)表示共有N個人要過河
每組測試數據的第二行是N個整數Si,表示此人過河所需要花時間。(0<Si<=100) - 輸出
- 輸出所有人都過河需要用的最少時間
- 樣例輸入
-
1 4 1 2 5 10
- 樣例輸出
-
17
過河方法:人數大於3時,
第一種可能快的方法是、:最快和次快的先過,最快的回來,然後最慢和次慢的過,然後讓次快的回來,直到人數小於等於3為止
第二種可能快的方法是、:每次都是最快的送最慢的過橋,最快的回來,再送剩餘人數中最慢的過,直到人數小於等於3為止。
查看代碼---運行號:252575----結果:Accepted
運行時間:2012-10-06 11:25:47 | 運行人:huangyibiao
01.#include <iostream>
02.#include <algorithm>
03.using
namespace std;
04.
05.int
main()
06.{
07.int
sample;
08.cin >> sample;
09.
10.while
(sample --)
11.{
12.int
nPeople;//人數
13.cin >> nPeople;
14.
15.int
*time
= new int[nPeople];
16.for
(int
i = 0; i < nPeople; i++)
17.cin >>
time[i];
18.
19.sort(time,
time+nPeople);//時間從小到大排序
20.
21.int
minTime = 0;
22.while
(nPeople > 3)
23.{
24.minTime += min(time[0] +
time[1] * 2 +
time[nPeople-1],
25.time[0] * 2 +
time[nPeople-2] +
time[nPeople-1]);
26.nPeople -= 2;
27.}
28.
29.if
(nPeople == 1)
30.{
31.minTime +=
time[0];
32.}
33.else
if (nPeople == 2)
34.{
35.minTime +=
time[1];
36.}
37.else
38.minTime +=
time[0] + time[1] +
time[2];
39.
40.cout << minTime << endl;
41.delete
[] time;
42.}
43.return
0;
44.}
最後更新:2017-04-02 15:14:53