2534 渡河

2534 渡河

2013年市队选拔赛广州

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold 
 
题目描述  Description

    有N个人需要渡河到对岸,但是只有一条小船,只能乘坐两人,请问怎么能够让他们以最少的时间渡河到对岸呢?

输入描述  Input Description

输入为两行,第一行为渡河的人数N (1<=N<=1000)

第二行为N个正整数,范围是 [1,100],代表他们划船到对岸需要多少分钟

输出描述  Output Description

输出只有一行,代表最短的渡河时间,单位为分钟

样例输入  Sample Input

3

2 3 50

样例输出  Sample Output

55

数据范围及提示  Data Size & Hint

N (1<=N<=1000)

思路:

动态规划,先排序,只有1个人和两个人是就是较慢的人的时间,多于两人时,有两种情况,在两种情况中却最小值,

第一种情况是由1号划回船,再把 i 个接过去 ,就是  f[i-1]+a[1]+a[i] 
第二种情况 是1号2号先过去,2号回,然后 i-1 和 i 号过去,1号回,最后1和2号过去 ,就是  f[i-2]+a[1]+a[i]+a[2]+a[2] 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 int n;
 7 long long a[100001];
 8 long long f[100001];
 9 long long ans;
10 
11 int main()
12 {
13     scanf("%d",&n);
14     for(int i=1; i<=n; i++)
15         scanf("%d",&a[i]);
16     sort(a+1,a+n+1);
17     f[1]=a[1];
18     f[2]=a[2];
19     for(int i=3; i<=n; i++)
20         f[i]=min(f[i-1]+a[1]+a[i],f[i-2]+a[2]+a[1]+a[i]+a[2]);
21     cout<<f[n];
22 }

 

转载于:https://www.cnblogs.com/mjtcn/p/6816985.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值