基本思想就是先排序,然后从相同a中选出b最大的值,保留,其余的值全加到最终代价中,这个过程用了一个priority_queue更新,每次在a值变换时计算。
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
long minprice(vector<vector<int>>& prices);
int main() {
int n;
cin >> n;
vector<vector<int>> prices(n, vector<int>(2));
for (int i = 0; i < n; i++) {
cin >> prices[i][0];
}
for (int i = 0; i < n; i++) {
cin >> prices[i][1];
}
cout << minprice(prices) << endl;
return 0;
}
long minprice(vector<vector<int>>& prices) {
sort(prices.begin(), prices.end(), [](vector<int>& a, vector<int>& b) {
return a[0] == b[0] ? a[1] < b[1] : a[0] < b[0];
}); // 从小到大排序
priority_queue<int,vector<int>,less<int>> q;
int cur = prices[0][0];
long all = 0, res = 0; // 最后几个用例值很大,需要用long保存
for(auto const& price : prices){
if (!q.empty() && price[0] != cur) {
while (!q.empty() && cur++ != price[0]) {
all -= q.top();
q.pop();
res += all;
}
cur = price[0];
}
q.push(price[1]);
all += price[1];
}
while (!q.empty()) {
all -= q.top();
q.pop();
res += all;
}
return res;
}
京公网安备 11010502036488号