链接:https://ac.nowcoder.com/acm/contest/5968/C

题目描述

牛市的幸存的先民在流星雨之后就忍痛离开了这片土地,选择迁徙,在迁徙的途中,他们需要渡过一条河。因为牛市的树木在流星雨中被严重破坏,所以他们只造出了一艘小船,船太小了,一次只能乘坐两人。
牛市的先民们每个人划船的速度都不尽相同,所以每个人都有一个渡河时间T,为了保证船的平衡,当穿上有两个人的时候,需要他们按照慢的那个人的速度划船,也就是说船到达对岸的时间等于船上渡河时间长的那个人的时间。
现在已知N个人的渡河时间T,请问最少要花费多少时间,才能使所有人都过河。

输入描述:

输入文件第一行为先民的人数N(N\leq 100000)(N≤100000),以下有N行,每行一个整数为每个人的渡河时间。

输出描述:

输出文件仅包含一个数,表示所有人都渡过河的最少渡河时间。
示例1
输入
4
5
7
11
16
输出
42
说明
首先1,2先到河对岸花费7,然后1回来花费5,3,4到河对岸花费16,2回来花费7,1,2再到河对岸花费7


#include<iostream>
#include<algorithm>
using namespace std;
int n;
int t[100005],dp[100005];
int main() {
    cin>>n;
    for(int i=1; i<=n; i++)
        cin>>t[i];
    sort(t+1,t+n+1);
    dp[1]=t[1];//如果只有一个人,那么用时就是他的时间 
    dp[2]=t[2];//如果两个人,那么用时就是排序后用时长的人的时间 
    for(int i=3; i<=n; i++){
        dp[i]=min(dp[i-1]+t[1]+t[i],dp[i-2]+t[1]+2*t[2]+t[i]);
    }//如果人数>=3 
    //1.渡河了的回去一个用时最少的接人
    //2.渡河了的回去两个用时最少的接人,两个用时多的一起过河,两个用时少的一起过河 
    //例如还有两个人未渡河,他们用时为20,21,已经渡河的人中用时最少的两个为5,6
    //那么5,6同时 回去接人,比5回去接两次人用时少
    //所以我们只需要取这两种情况用时少的即可 
    cout<<dp[n];
    return 0;
}