1 条题解

  • 0
    @ 2026-2-1 22:41:28
    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        // [1] 动态数组存储每个人的过河时间
        vector<int> arr;
        // [2] 读取需要过河的人数
        int n;
        cin>>n;
    
        // [3] 读取n个人的过河时间,存入数组
        for(int i=0;i<n;i++){
            long long a;
            cin>>a;
            arr.push_back(a); 
        }
    
        // [4] 对过河时间进行升序排序,方便贪心策略计算
        sort(arr.begin(),arr.end());
    
        // [5] 初始化总时间和两种策略的时间变量
        int sum=0,sum1=0,sum2=0;
    
        // [6] 当人数≥4时,循环处理最慢的两个人过河
        while(n>=4){
            // 策略1:最快的人往返送最慢的两人过河
            sum1=2*arr[0]+arr[n-1]+arr[n-2];
            // 策略2:最快的两人配合送最慢的两人过河
            sum2=arr[0]+2*arr[1]+arr[n-1];
            // 选择两种策略中耗时更少的一种,累加到总时间
            sum+=min(sum1,sum2);
            // 每次处理2人,剩余人数减2
            n=n-2; 
        }
    
        // [7] 处理剩余人数不足4人的情况
        if(n==1 ) 
            sum+=arr[0]; // 仅1人时,直接过河
        else if(n==2) 
            sum+=arr[1]; // 2人时,一起过河,耗时为较慢者的时间
        else 
            sum+=arr[1]+arr[0]+arr[n-1]; // 3人时,最快的送最慢的过去再回来,再和次快的一起过去
    
        // [8] 输出所有人过河的最短时间
        cout<<sum;
        return 0;
    }
    
    • 1

    信息

    ID
    1045
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    2
    已通过
    1
    上传者