小船過河問題(貪心)


題意:

  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 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM