1 条题解

  • 1
    @ 2025-4-5 16:42:15

    本题要点:

    11d[p]d[p] 表示电梯停留在pp层的不满意度 比较 d[p+1]d[p + 1]d[p]d[p] 的差值,分解为三部分 第一部分:s1=sum1K[1],2K[2],,nK[n]s1 = sum{1 * K[1], 2 * K[2], …, n * K[n]}, 这部分是常数值 第二部分:用数组 s2[MaxN]s2[MaxN] 存储,假设电梯停留在pps2[p]=(b+p)sumK[1],K[2],,K[p]s2[p] = (b + p) * sum{K[1], K[2], … , K[p]} 第三部分:用数组 s3[MaxN]s3[MaxN] 存储, 假设电梯停留在pp层 $s3[p] = (a - p - 1) * sum{K[p + 1], K[p + 1], … , K[n]}$

    22、先计算 s1s1, 复杂度 O(n)O(n); 同理数组 s2,s3,s2, s3, 复杂度也是 O(n)O(n); 先计算 电梯停留在一层的 d[1]d[1], 利用递推公式可以计算每一层 的 不满意度d[p]d[p], 记录最小值即可

    标程

    #include <iostream>
    #include <cstring>
    
    int main() {
        int T;
        std::cin >> T;
        while (T--) {
            int M, a, b, i;
            int k[10001];
            long long down[10001], up[10001];
            std::cin >> M >> a >> b;
            for (i = 1; i <= M; i++) {
                std::cin >> k[i];
            }
            long long sum0 = k[1], sum1 = 0;
    
            down[1] = 0;
            for (i = 2; i <= M; i++) { // 求下楼不满意度
                down[i] = down[i - 1] + b * sum0 + sum1;
                sum1 += sum0; // 这条语句和下面语句位置不能换
                sum0 += k[i];
            }
    
            sum0 = k[M];
            sum1 = 0;
            up[M] = 0;
            for (i = M - 1; i >= 1; i--) { // 求上楼不满意度
                up[i] = up[i + 1] + a * sum0 + sum1;
                sum1 += sum0;
                sum0 += k[i];
            }
    
            long long min_d = down[1] + up[1];
            int d = 1;
            for (i = 2; i <= M; i++) {
                if (down[i] + up[i] < min_d) {
                    min_d = down[i] + up[i]; // 最小不满意度
                    d = i; // 楼层
                }
            }
            std::cout << d << std::endl;
        }
        return 0;
    }    
    
    
    • 1

    信息

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