SDUT 2868 贪心(最短时间过河问题)

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

n个人要过一座桥,只是在漆黑的夜里,没有火把显然是不行的。但是这n个人只有一个火把,并且这座桥每次最多只能通过两个人。
每个人的速度不同,若两人组队,队伍速度等于较慢一人的速度。你要做的是计算这n个人全部通过这座桥的最少时间。

输入

多组输入。每组数据的第一行是输入一个n,代表有n(1 <= n && n <= 500)个人,接下来的n个整数,代表着每个人穿过这座桥所需要的时间。

输出

输出一个整数,代表最优策略所需时间。

示例输入

4
1
10
5
2

示例输出

17

提示

假设人员编号按输入顺序从1到n,首先编号为1,4的人通过,编号为1的回来送火把,然后编号为2,3组队通过,编号为4的回来送火把,编号为1,4通过,结束。
Sum = 2 + 1 + 10 + 2 + 2 = 17。

来源

 
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
int a[100000];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        sort(a,a+n);
        int sum=0;
        ///四个人作为一组进行看待
        ///两种方式第一种:每次走都是一个最大的携带一个最小的,然后小的单独回来
        ///第二种方式:第一次携带最小的两个去然后小的回来,之后携带两个最大的去,然后携带上一次的第二小的回来,
        while(n>3)
        {
            int sum1=2*a[0]+a[n-1]+a[n-2];  
            int sum2=a[0]+a[1]*2+a[n-1];
            if(sum1<sum2)
                sum+=sum1;
            else
                sum+=sum2;
            n-=2;
        }
        if(n==1)
            sum+=a[0];
        if(n==2)
            sum+=a[1];
        if(n==3)
            sum+=a[0]+a[1]+a[2];
        printf("%d\n",sum);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值