小船过河问题(贪心)


题意:

  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