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

1700 Crossing River

时间:2015-10-17 17:32:14      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:

题目链接: 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 }

 

1700 Crossing River

标签:

原文地址:http://www.cnblogs.com/roger9567/p/4887716.html

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