很经典的过桥问题。额,所以就不解释题意了。
思路:当n <= 3 时,都视为特殊情况,处理就不用说了。当 n>= 4 时,有两种较优的过桥方式。
设最快的人为a[0],次快的人为a[1],最慢的和次慢的为a[n-1],a[n-2]。
① 最快的人和最慢的走,再回去和次慢的一起走,再单独回去。耗时:a[n-1]+a[0]+a[n-2]+a[0];
② 最快和次快先走,最快回去,最慢和次慢的过桥,然后次快的回去。耗时:a[1]+a[0]+a[n-1]+a[1];
每次两者取最优解。最快和次快的人一直在做苦力.......
代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <climits>
using namespace std;
#define MAX 1050
#define INF 0x7FFFFFFF
int men[MAX];
int main()
{
int t,n,i,j;
int total=0;
scanf("%d",&n);
for(i=0; i<n; i++)
scanf("%d",&men[i]);
sort(men,men+n);//时间由少到多排序
while(n-3>0)
{
if(men[1]*2>men[n-2]+men[0])//if else 两者取最优解:两种可能的最短时间取短的
total+=men[0]*2+men[n-1]+men[n-2];
else total+=men[1]*2+men[0]+men[n-1];
n-=2;//一次两个人
}
//以下特例,枚举即可
if(n==3)
total+=men[0]+men[1]+men[2];
if(n==2)
total+=men[1];
if(n==1)
total+=men[0];
cout<<total<<endl;
return 0;
}