码迷,mamicode.com
首页 > 其他好文 > 详细

Crossing River

时间:2015-07-17 18:25:11      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:

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

题意 :

         有N个人想要过河,但是只有一条船,且每次最多载2个人,而每次必须有个人把船开回来。每个人过河都会有不同的时间,当两个人一起过河时,过河时间

         为更慢的那个人的,即两个数中取更大的那个数,你所要做的是求出在这N个人中总共过河的最短时间。

         案例:

         input

        1

        4

        1 2 5 10

        output

        17

题目分析:

         每次都要尽量让最快的人把船开回来,要先进行排序,这样就有两种不同的方法:

         1)在排好序的数中先让用时最少的两个人过去,让用时最少的回来,再让用时最多两个过去,让用时第二少的回来,循环一次,再让最少的两个人过去。。。

             这样利用k=k+2一直循环下去。但是,奇数和偶数是有不同的,所以到了这里又要分开讨论。

         2)在排好序的数中,让第一个用时最少的人依次和用时最多的过去,每次都让用时最少的回来,到最后只剩下两个人是不需再回来。

         不管用哪种方法算出的时间都不是所有的案例的最少的时间,所以需要把两种方法合并起来,而两种方法排完序的前三个数的方法一样,所以循环条件为k>2,

         再对于k==0,k==1,k==2分开讲。

源代码如下:

         

 1 #include<iostream>
 2 #include<algorithm>
 3 #define max 1000
 4 using namespace std;
 5 int main()
 6 {
 7     int T,N,a[max],k,n,m,s;
 8     cin>>T;
 9     for(int i=0;i<T;i++)
10     {
11         s=0;
12         cin>>N;
13         for(k=0;k<N;k++)
14             cin>>a[k];
15         sort(a,a+N);
16         for(k=N-1;k>2;k=k-2)
17         {
18             n=a[0]+2*a[1]+a[k];
19             m=2*a[0]+a[k]+a[k-1];
20             if(n>m)
21                 s+=m;
22             else
23                 s+=n;
24         }
25         if(k==0)
26             s=a[0];
27         else if(k==1)
28             s+=a[1];
29         else if(k==2)
30             s+=a[1]+a[2]+a[0];
31 
32        cout<<s<<endl;
33     }
34     return 0;
35 }

 

Crossing River

标签:

原文地址:http://www.cnblogs.com/q-c-y/p/4654920.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!