POJ 1700 过河坐船最短时间问题

     这道题如果理解了就不难了,可分为一步步两个永远最快的a[0],a[1]载现存的两个最慢的过河的问题,一种是最快a[0]载现存最慢过去,0再回来,再载次慢,0再回来,时间为2*a[0]+t[p-2]+t[p-1]或者01过去,0回来,34过去(不可能0再载3或者4过去,那就浪费了第一次0载1过去的意义,等于在第一种方案基础上把34载过去又把2载过去2回来,时间为a[0]+2*a[1]+t[p-1],再根据更新的数据,比较大小,继续选定方案.


#include <iostream>
#include <algorithm>

using namespace std;

bool cmp(int a,int b){
    return a<b;
}

int main(){
   int cnt,p,i,sum;
   int *a = new int[1005];
   cin>>cnt;
   while(cnt--){
        sum = 0;
        cin>>p;
        for(int i = 0;i<p;i++)
                cin>>a[i];
                sort(a,a+p,cmp);
            for(i=p-1;i>2;i-=2){
            if(a[0]+2*a[1]+a[i]>2*a[0]+a[i-1]+a[i]) //主要就在这两种坐船的方式,比较2a【1】和a[0]+a[i-1]的时间,由输入数据决定
                sum+=2*a[0]+a[i-1]+a[i];
            else sum+=a[0]+2*a[1]+a[i];
            }
            if(i==2) sum+=a[0]+a[1]+a[2];
            else if(i==1) sum+=a[1];
            else sum+=a[0];
            cout<<sum<<endl;
    }
    delete []a;
    return 0;

    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值