poj 1700 Crossing River 贪心

时空隧道


题目大意:
有n个人想要过河,每一次有两人可以坐船过河,一个人划回来,问最少过河时间


分析:
我们考虑abxy这四个人
a是最快的,b是次快的,x是最慢的,y是次慢的
我们需要把xy运送过河,有两种方法:
ab–>,<–a,xy–>,<–b
所需时间为x+b+b+a
ay–>,<–a,ax–>,<–a
所需时间为x+a+y+a
很明显这是对的,因为最慢的一定要和次慢的一起过河,而中途需要一个或者两个人把船划回来,那么最快的和次快的就充当了摆渡者的角色


代码如下:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=1000+5;
int cas,n,tim[maxn];
signed main(void){
    scanf("%d",&cas);
    while(cas--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&tim[i]);
        sort(tim+1,tim+n+1);
        if(n==1){
            cout<<tim[1]<<endl;
            continue;
        }
        int tail=n,ans=0;
        while(tail>3){
            ans+=tim[tail]+tim[1]+min(tim[2]+tim[2],tim[1]+tim[tail-1]);
            tail-=2;
        }
        if(tail==3)
            ans+=tim[1]+tim[2]+tim[3];
        else
            ans+=tim[2];
        cout<<ans<<endl;
    }
    return 0;
}

by >_< neighthorn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值