1 条题解

  • 0
    @ 2026-9-30 12:59:15

    C++ :

    
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    /* 每趟最多 2 人过河、时间取较慢者;氧气瓶要送回。
       经典策略:先排序。每次把最慢的两人送过去,两种方案取小。 */
    int t[1005];
    int main(){
        int n;
        if(scanf("%d",&n)!=1) return 0;
        for(int i=0;i<n;i++) scanf("%d",&t[i]);
        sort(t,t+n);
        if(n<=0){ printf("0\n"); return 0; }
        if(n==1){ printf("%d\n", t[0]); return 0; }
        long long cost=0;
        int m=n;
        while(m>3){
            long long a=(long long)t[0]+2LL*t[1]+t[m-1];   // 最快的两人来回
            long long b=2LL*t[0]+t[m-1]+t[m-2];            // 最快的人每次带一个
            cost += a<b?a:b;
            m-=2;
        }
        if(m==3)      cost += (long long)t[0]+t[1]+t[2];
        else if(m==2) cost += t[1];
        printf("%lld\n", cost);
        return 0;
    }
    
    
    • 1

    信息

    ID
    2851
    时间
    1000ms
    内存
    256MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者