首页 > 编程语言 > 详细

poj1700-Crossing River(贪心算法)

时间:2015-10-17 13:21:55      阅读:351      评论:0      收藏:0      [点我收藏+]

一,题意:
  只有一艘船,能乘2人,船的运行时间为2人中较多一人的时间,过去后还需一个人把船划回来,问把n个人运到对岸,最少需要多久。
二,思路步骤:
  想办法先把用时最多的2人,运过去,再把剩下来的人中用时最多的2人运过去,依次循环下去,直到n<=3。
  1,n>3时:
    ①最快和次快过去,最快回;最慢和次慢过去,次快回,time=s[1]+s[0]+s[n-1]+s[1]。
    ②最快和最慢过去,最快回;最快和次快过去,最快回,time=s[n-1]+s[0]+s[n-2]+s[0]。
   选择两者中用时较少的一个策略执行。如此便将最慢和次慢送过河,对剩下n-2个人循环处理
   注意:当n=1、n=2、n=3时直接相加处理即可.
  2,n==3时 ①= ②= time + s[0]+s[1]+s[2];
  3,n==2时 time += s[1];
  4,n==1时 time += s[0]。

技术分享
 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int main(){
 5     int t , n ;
 6     int s[1005];
 7     cin>>t;
 8     while(t--){
 9         cin>>n;
10         int time = 0;
11         for(int i = 0 ; i < n ; i++){
12             cin>>s[i];
13         }
14         while(n>3){   //当n>3时,重复方法选择最小的用时相加 
15             time = min(time + s[1]+s[0]+s[n-1]+s[1],time + s[n-1]+s[0]+s[n-2]+s[0]); 
16              n-=2;  //每次循坏过2个人 
17         }
18         if(n==3)time += s[0]+s[1]+s[2];
19         else if(n==2)time += s[1];
20         else time += s[0];
21         cout<<time<<endl;
22     }
23     return 0;
24 }
View Code

 版权声明:本文为博主原创文章,未经博主允许不得转载。

poj1700-Crossing River(贪心算法)

原文:http://www.cnblogs.com/My-Sunshine/p/4887305.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!