1 条题解

  • 1
    @ 2025-4-5 16:25:54

    思路

    先排序,然后假设数据为t1t2t3t4t5t6t7t8t1 t2 t3 t4 t5 t6 t7 t8,只会有两种方式:

    方式一:

    最快的两个作为划回的船,两个来回运走两个最慢的,好处是最慢的和次慢的组合消除掉次慢的时间,坏处是往回划的有一半是次快的。时间:t1+2t2+t8t1+2*t2+t8

    方式二:

    只有最快的作为划回的船,两个来回运走两个最慢的,好处是往回划的时间是最优的,坏处是往对岸划的次慢的时间也走了。时间:2t1+t7+t82*t1+t7+t8 综合两种情况,只需要把数据划分为1231,2,3,大于44个这四种情况,大于44的时候比较方式一和二取最小值,1231、2、3的时候单独讨论即可

    标程

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    using namespace std;
    
    // 选择排序函数,对数组进行排序
    void sort(int *pe, int n) {
        int i, j;
        int temp;
        for (i = 0; i < n; i++) {
            for (j = n - 1; j > i; j--) {
                if (pe[j] < pe[j - 1]) {
                    temp = pe[j];
                    pe[j] = pe[j - 1];
                    pe[j - 1] = temp;
                }
            }
        }
    }
    
    int main() {
        int t, n;
        int pe[1000];
        int i;
        int sum;
        scanf("%d", &t);
        while (t--) {
            sum = 0;
            scanf("%d", &n);
            for (i = 0; i < n; i++) {
                scanf("%d", &pe[i]);
            }
            sort(pe, n);
            while (n > 0) {
                if (n == 1) {
                    sum += pe[0];
                    n = 0;
                }
                else if (n == 2) {
                    sum += pe[1];
                    n = 0;
                }
                else if (n == 3) {
                    sum += (pe[1] + pe[0] + pe[2]);
                    n = 0;
                }
                else {
                    int a1 = pe[0] + pe[1] * 2 + pe[n - 1];
                    int a2 = pe[0] * 2 + pe[n - 1] + pe[n - 2];
                    sum += (a1 < a2)? a1 : a2;
                    n -= 2;
                }
            }
            printf("%d\n", sum);
        }
        return 0;
    }
    
    
    • 1

    信息

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