题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1826
input | output |
---|---|
4 1 10 5 2 |
17 |
题意:
有n个人要经过一片雷区,但是他们只有一个扫雷用的探测器,所以每次只能过去两个人,其中一个人把探测器拿回来,继续再过去两个人,
每个人的行走速度不同,所花费的时间,是按照两个人中较慢的那个人所用时间计算的!
求全部人通过雷区的最短时间!
PS:
每次先把最大的两个移过去,当人数大于等于4的时候,
分两种情况:
1:最小的来回几次把最大的两个带过去。
2:先让最小的两个过去,然后最小的把探测器的回来,然后最大的两个过去,对面最小的把探测器带回来。
代码如下:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int a[147]; int ans = 0; void cal(int m) { if(m == 1) { ans+=a[0]; } else if(m == 2) { ans+=a[1]; } else if(m == 3) { ans+=a[0]+a[1]+a[2]; } else { if((a[0]*2+a[m-1]+a[m-2]) < (a[0]+2*a[1]+a[m-1])) { ans+=a[0]*2+a[m-1]+a[m-2];//0号一个人来回 } else { ans+=a[0]+2*a[1]+a[m-1];//0,1号两个人来回 } cal(m-2); } } int main() { int n; while(~scanf("%d",&n)) { for(int i = 0; i < n; i++) { scanf("%d",&a[i]); } sort(a,a+n); cal(n); printf("%d\n",ans); } return 0; }
原文:http://blog.csdn.net/u012860063/article/details/44279717