題意:
N個人過河,船每次只能坐兩個人,船載每個人過河的所需時間不同t[i],每次過河的時間為船上的人的較慢的那個,問最快的過河時間。(船划過去要有一個人划回來)
最優選擇:
先將所有人過河所需的時間按照升序排序,我們考慮把單獨過河所需要時間最多的兩個旅行者送到對岸去,有兩種方式:
1.最快的和次快的過河,然后最快的將船划回來;次慢的和最慢的過河,然后次快的將船划回來,所需時間為:t[0]+2*t[1]+t[n-1];
2.最快的和最慢的過河,然后最快的將船划回來,最快的和次慢的過河,然后最快的將船划回來,所需時間為:2*t[0]+t[n-2]+t[n-1]。
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 bool compare(int a, int b) 5 { 6 return a < b; 7 } 8 9 int main() 10 { 11 int n; 12 while(cin >> n) 13 { 14 int *a = new int[n]; 15 for(int i = 0; i < n; i++) 16 { 17 cin >> a[i]; 18 } 19 sort(a, a + n, compare); 20 int sum = 0; 21 while(n > 3) 22 { 23 int less = a[0] + 2 * a[1] + a[n - 1]; 24 if((a[0] + 2 * a[1] + a[n - 1]) > (2 * a[0] + a[n - 2] + a[n - 1]))//兩種方式選擇 25 less = 2 * a[0] + a[n - 2] + a[n - 1]; 26 sum += less; 27 n -= 2; 28 } 29 if(n == 3) 30 { 31 sum += (a[0] + a[1] + a[2]); //剩三人 32 } 33 else if(n == 2) //剩兩人 34 { 35 sum += a[1]; 36 } 37 else sum += a[0];//剩一人 38 cout << sum << "\n"; 39 } 40 return 0; 41 }
