原题: http://poj.org/problem?id=1700
//经典过河问题 //题目大意: 有N个人要过河,但是只有一艘船,每次最多只能坐两个人,而过河后,如果还有人需要渡河,就需要岸上某个人重新把船划回来 // 每个人单独划船的速度已知,两个人一起坐船的速度取决于速度较慢的那个人,问这n个人渡河需要的最少时间 //思路:如果有4个人渡河a,b,c,d,速度由小到大是 t1,t2,t3,t4,问题的关键在于如何把速度最慢的两个人运过去. // 共有两种方案: ①a,b先过河,a回;c,d过河,b回 时间:t2+t1+t4+t2 // ②a,d先过河,a回;a,c过河,a回 时间:t4+t1+t3+t1 // 每次过河取时间最短的方案,直到最后人数<=3人,我们便可以计算出最终结果 #include<iostream> #include<algorithm> #include<cstdio> using namespace std; int t[1001]={0}; int cmp(int a,int b) { return a<b; } int m(int a,int b) { if(a<b)return a; else return b; } int main() { int k; scanf("%d",&k); while(k--) { int n; scanf("%d",&n); int i; for(i=1;i<=n;i++) { scanf("%d",&t[i]); } if(n==1){ printf("%d\n",t[1]); }else{ sort(t+1,t+n+1,cmp); int end=n; int min=0; while(end>=4){ min=min+m(t[2]+t[1]+t[2]+t[end],t[end]+t[end-1]+2*t[1]);//每次取时间最短的方案 end=end-2; } if(end==3){ min=min+t[1]+t[2]+t[3]; }else if(end==2){ min=min+t[2]; } printf("%d\n",min); } } return 0; }