Crossing River

题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=26251

题目大意:

     渡河问题,多组案例T(1<=T<=20),每个案例中有N(N<=1000)个人。每一次渡河最多两人一起,渡河时长按速度慢的即耗时最长的计算,分别给出N个人渡河所需时间(不超过100s),问:怎样安排可以让所有人渡过河且耗时最短?

     案例:

 

              Sample Input

              1
              4
              1 2 5 10

 

             Sample Output

             17

题目分析:

     分情况讨论(运用条件判别语句),如果仅有一人渡河,则耗时为其渡河时长;如果有两人渡河,按耗时最长的计算渡河时长;如果三人渡河(需要注意的是两人渡河后须有一人划船返回),不管采用何种方式,渡河时长均为三人渡河时长累加;如果超过三人以上的人渡河,则有两种快速过河方式:将时长从小到大排序(sort语句)1.始终让最快的人接送他人;2.让最快和次快的人合力接送,譬如a[0]和a[1]先渡河,a[1]回,再a[N-1]和a[N-2]渡河,a[1]回,如此循环。则将a[N-1]和a[N-2]渡河有两种方式,采取耗时最短的即可。

源代码:

 

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 const int maxn=1000;
 5 int a[maxn];
 6 int main()
 7 {
 8     int T,n,j,k,count,count1,count2;
 9     scanf("%d",&T);//案例数
10     for(k=0;k<T;k++)
11     {   count=0;
12         scanf("%d",&n);//渡河人数
13         for(j=0;j<n;j++)
14             scanf("%d",&a[j]);//个人渡河时长
15         sort(a,a+n);//排序
16         while(n)//未渡河的人中耗时最长的两人渡河
17         {     if(n==1) 
18              { count+=a[0];
19                break;}
20              else if(n==2)
21              {    count+=a[1];
22                   break;}
23              else if(n==3)
24              {    count+=a[0]+a[1]+a[2];
25                   break;}
26              else
27              {    count1=a[1]+a[0]+a[n-1]+a[1];//两人使用第一快速渡河法渡河耗时
28                   count2=a[n-1]+a[0]+a[n-2]+a[0];//两人使用第二快速渡河法渡河耗时
29                   if(count1<count2) count+=count1;//最短耗时长累计
30                   else count+=count2;
31              }
32              n-=2;
33         }
34         printf("%d\n",count);
35     }
36     return 0;
37 }

 

posted @ 2015-07-18 09:13  ~瞬间*  阅读(172)  评论(0编辑  收藏  举报