1 条题解
-
0
练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