1 条题解

  • 1
    @ 2025-1-8 14:12:35

    贡献法 解法

    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int N=100010;
    int n;
    int a[N];
    long long ans;
    int main()
    {
        cin >> n;
        for(int i = 1;i <= n; ++ i) cin >> a[i];
        sort(a + 1, a + n + 1);//小的在前面 - 贪心
        for(int i = 1; i <= n; ++ i)
        {
            ans += (a[i]) * (n - i);//第 i 个人打水时间会被后面 n - i 个人等待
          //累加每个人对答案的贡献
        }
        cout << ans << '\n';
        return 0;
    }
    

    前缀和 解法

    #include <iostream>
    #include <algorithm>
    using namespace std;
    typedef long long LL;
    const int N = 100010;
    LL a[N], s[N];
    LL n, ans;
    int main()
    {
        cin >> n;
        for(int i = 1; i <= n; ++ i) cin >> a[i];
    
        sort(a + 1, a + n + 1);//小的在前面 - 贪心
    
        for(int i = 1; i <= n; ++ i)
        {
            s[i] = s[i - 1] + a[i];
            ans += s[i - 1];//当前这个人等待了前面 i - 1 个人的时间
        }
        cout << ans << '\n';
        return 0;
    }
    
    • 1

    信息

    ID
    5524
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    5
    已通过
    4
    上传者