题目链接: http://poj.org/problem?id=1700
1. 当1个人时: 直接过河 t[0].
2. 当2个人时: 时间为较慢的那个 t[1].
3. 当3个人时: 时间为 t[0]+t[1]+t[2].
4. 当4个以上的人时, 将t[0] 和 t[1]当作搬运工. 两种方案:
- 最快和次快的过去, 最快的回来, 最慢和次慢的过去, 次快的回来, 这样就将最慢和次慢的送过去了. 时间: t[0]+2*t[1]+t[i]
- 最快的依次送最慢和次慢的过去再回来, 时间: 2*t[0]+t[i-1]+t[i]
以上方案每次就将最慢的和次慢的送过河, 每次送走两个人, 当将其他人送完之后, t[0]和t[1]再过河.
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 bool comp(int a,int b){ 5 return a<b; 6 } 7 int main(){ 8 int m,n,t[10001],i,sum; 9 cin>>m; 10 while(m--){ 11 cin>>n; 12 sum = 0; 13 for(i=0;i<n;++i) 14 cin>>t[i]; 15 sort(t,t+n,comp); 16 for(i=n-1;i>2;i-=2){ 17 //把t[0]和t[1]当成搬运工,最后返回到原地 18 int t1 = t[0]+2*t[1]+t[i];//最快的(即所用时间t[0])和次快的过河,然后最快的将船划回来,再次慢的和最慢的过河,然后次快的将船划回来 19 int t2 = 2*t[0]+t[i-1]+t[i];//最快的和最慢的过河,然后最快的将船划回来,再最快的和次慢的过河,然后最快的将船划回来 20 sum += t1>t2?t2:t1; 21 } 22 if(i==2) //3people left 23 sum += t[0]+t[1]+t[2]; 24 else if(i==1) //2 people left 25 sum += t[1]; 26 else // 1 people left 27 sum += t[0]; 28 cout<<sum<<endl; 29 } 30 return 0; 31 }
时间: 2024-11-08 20:11:28