1 条题解

  • 0
    @ 2034-8-5 21:33:50

    练55.3 收益最大

    解题思路

    报价升序排序,枚举每个报价作为统一售价p,愿意购买者为n-i人,实际能售min(m,n-i)批。计算p乘销量,最大收益相同保留更低价格。

    正确性说明

    若售价位于两个报价之间,提高到下一个报价不会减少买家且能增加收益,故最优售价一定可取某个报价。枚举所有此类候选并考虑库存后取最优即可。

    易错点

    不能对每人按不同报价卖;库存限制销量。

    复杂度

    时间O(n log n),空间O(n)。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int m, n;
        cin >> m >> n;
        vector<long long> a(n);
        for (auto &x : a)
            cin >> x;
        sort(a.begin(), a.end());
        long long best = -1, price = 0;
        for (int i = 0; i < n; i++) {
            long long gain = a[i] * min(m, n - i);
            if (gain > best) {
                best = gain;
                price = a[i];
            }
        }
        cout << price << " " << best << "\n";
        return 0;
    }
    
    • 1

    信息

    ID
    370
    时间
    1000ms
    内存
    64MiB
    难度
    进阶
    标签
    递交数
    0
    已通过
    0
    上传者