首页 > 代码库 > poj - 1700 题解

poj - 1700 题解

大概题意:N个人要过河,一个船最多承载两人,且过河速度等于船上划船速度最慢的人的速度,求过河的最短时间。

题目解法:首先对题目进行分析,可以发现:船过了河还要有一个人再把船送回来。

假设把人按过河速度从大到小排序并编号1-4,则会发现有两种过河方式:1.13一组,1回来,24一组,2回来,12一组,完成;2.12一组,1回来,13一组,1回来,14一组,完成。

因此贪心策略就是:把人按过河速度从大到小排序,然后按上述方式过河,每次选取最优方式。

代码如下:

 1     #include<iostream>
 2     #include<algorithm>
 3     using namespace std;
 4     int a[1001];
 5     bool com(const int& x,const int& y)
 6     {
 7         return x<y;
 8     }
 9     int main()
10     {
11         int T;
12         cin>>T;
13         for(int t=1;t<=T;t++)
14         {
15             int n;
16             cin>>n;
17             for(int i=1;i<=n;i++)
18             {
19                 cin>>a[i];
20             }
21             sort(a+1,a+n+1,com);
22             if(n==1)
23             {
24                 cout<<a[1]<<endl;
25                 continue;
26             }
27             if(n==2)
28             {
29                 cout<<a[2]<<endl;
30                 continue;
31             }
32             if(n==3)
33             {
34                 cout<<a[2]+a[1]+a[3]<<endl;
35                 continue;
36             }
37             int res=a[2];
38             int tip=n;
39             if(n%2==0)
40             {
41                 while(tip>=4)
42                 {
43                     int t1=a[1]+a[2]+a[2]+a[tip];
44                     int t2=a[tip]+a[1]+a[tip-1]+a[1];
45                     res+=min(t1,t2);
46                     tip-=2;
47                 }
48             }
49             else
50             {
51                 while(tip>=5)
52                 {
53                     int t1=a[1]+a[2]+a[2]+a[tip];
54                     int t2=a[1]+a[tip]+a[1]+a[tip-1];
55                     res+=min(t1,t2);
56                     tip-=2;
57                 }
58                 res+=a[1]+a[3];
59             }
60             cout<<res<<endl;
61         }
62         return 0;
63     }

 

poj - 1700 题解