题意:
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 }