1 条题解

  • 0
    @ 2026-3-3 10:59:45

    文字教学

    这道题用贪心算法解决,核心思路是让接水时间短的人优先接水,这样能最小化总等待时间(平均等待时间也随之最小):

    1. 总等待时间的计算:第1个人接水时,后面所有人都要等他的时间;第2个人接水时,后面的人等他的时间……因此要让时间短的人乘上更大的“等待人数系数”。
    2. 排序规则:先按接水时间从小到大排,时间相同则编号小的排前面。
    3. 计算总等待时间并求平均,按格式输出即可。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    struct P {
        int t, id;
    } p[1005];
    
    int main() {
        int n;
        long long sum = 0;
        cin >> n;
        for (int i = 0; i < n; ++i) {
            cin >> p[i].t;
            p[i].id = i + 1;
        }
        
        // 冒泡排序:按t升序,t相同按id升序
        for (int i = 0; i < n - 1; ++i) {
            for (int j = 0; j < n - 1 - i; ++j) {
                if (p[j].t > p[j + 1].t || 
                   (p[j].t == p[j + 1].t && p[j].id > p[j + 1].id)) {
                    P tmp = p[j];
                    p[j] = p[j + 1];
                    p[j + 1] = tmp;
                }
            }
        }
        
        // 输出顺序
        for (int i = 0; i < n; ++i)
            cout << p[i].id << " ";
        cout << endl;
        
        // 计算总等待时间
        for (int i = 0; i < n; ++i)
            sum += (long long)p[i].t * (n - 1 - i);
        
        printf("%.2f\n", (double)sum / n);
        return 0;
    }
    
    • 1

    信息

    ID
    223
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    12
    已通过
    8
    上传者