zoukankan      html  css  js  c++  java
  • poj1700-Crossing River(贪心算法)

    一,题意:
      只有一艘船,能乘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

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

  • 相关阅读:
    java线程的几种状态
    java事务的处理
    Java多线程中Sleep与Wait的区别
    分享一百多套开发视频教程的下载地址
    [Java]读取文件方法大全
    Android开发人员必备的10 个开发工具
    CentOS 安装MySQL rpm方式安装
    记录一些经典的算法
    CentOS 7安装Redis服务
    linux查看文件大小,磁盘占用情况 du df命令
  • 原文地址:https://www.cnblogs.com/My-Sunshine/p/4887305.html
Copyright © 2011-2022 走看看