1. 程式人生 > >過河問題(二)

過河問題(二)

http amp 就是 target small sca %d sort 方法

問題描述

POJ 1700

在一個漆黑的夜裏,N為旅行者來到狹窄而沒有護欄的橋邊。如果不借助手電筒的話,大家是無論如何也不敢過橋去的。不幸的是,N個人一共只帶了一只手電筒,而橋窄得只夠讓兩個人同時過。如果各自單獨過橋的話,N人所需要的時間已知;而如果兩人同時過橋,所需要的時間就是走得比較慢的那個人單獨行動時所需的時間。問題是,如何設計一個方案,讓這N人盡快過橋。

解題思路

很容易想到使用貪心策略,但具體怎麽做呢?

假設共5個人T1、T2、T3、T4、T5,時間一次增加,如何用最少的時間使得5人都過河?

考慮先將T4和T5過河(最慢的兩個安排好了,無後效性),經過簡單比較,有兩種較優方法。

1、T1和T2過河,T1回來,T4和T5過河,T2回來(總時間:T2 + T1 + T5 + T2)

2、T1和T4過河,T1回來,T1和T5過河,T1回來(總時間:T4 + T1 + T5 + T1)

然後問題簡化為只有3個人T1、T2、T3,n≤3的情況直接觀察。

推廣到n個人(n ≥ 4),只需取(T1 + 2*T2 + Tn)和(2*T1 + Tn-1 + Tn)中的較小者,問題化為前n-2個人的情況。

代碼實現

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 const int maxn = 1000 + 10
; 7 int n,times[maxn]; 8 9 int main() 10 { 11 int T; 12 scanf("%d", &T); 13 while (T--) 14 { 15 scanf("%d", &n); 16 for (int i = 0; i < n; i++) scanf("%d", &times[i]); 17 sort(times, times + n); 18 int sum = 0; 19 while (n > 3
) 20 { 21 sum += min((times[0] + times[1] * 2 + times[n - 1]), (times[0] * 2 + times[n - 2] + times[n - 1])); 22 n -= 2; 23 } 24 if (n == 3) sum += (times[0] + times[1] + times[2]); 25 if (n == 2) sum += times[1]; 26 if (n == 1) sum += times[0]; 27 28 printf("%d\n", sum); 29 } 30 return 0; 31 }

參考鏈接:

https://www.cnblogs.com/ShiChaoPeng/p/5858690.html

https://blog.csdn.net/qq_40788630/article/details/79332774?utm_source=blogxgwz1

過河問題(二)