poj1700--贪心算法

题意:一群人坐船过河,船只有一辆,且一次最多坐两人,时间按慢的算。求最短过河时间?

  总共有两种做法可使用:

  1.先让最快和次快的过去,让最快的把船开回,再让最慢和次慢的过去,让次快的把船开回。需两个来回可将最慢和次慢过河。

  2.让最快带着最慢过河,最快将船开回,再让最快带着次慢过河,最快将船开回。也是两回合将最慢和次慢过河。

每两个来回可判断哪种方法最快,将最快的相加。


#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int n,m;
    cin>>n;
    while(n--){
        int a[1001],sum=0,res1,res2,i=0;
        cin>>m;
        for(i=0;i<m;i++)
        cin>>a[i];
        sort(a,a+m);
        for(i=m-1;i>2;i-=2){
            res1=a[1]*2+a[0]+a[i];
            res2=a[0]*2+a[i]+a[i-1];
            if(res1>res2)
            sum+=res2;
            else
            sum+=res1;
        } 
        if(i==2)
            sum+=a[2]+a[1]+a[0];
        else
            sum+=a[i];
        cout<<sum<<endl;
    }
}

 


 

posted on 2015-10-15 14:23  T~Z  阅读(769)  评论(0编辑  收藏  举报