思路:贪心
参考题目:leetcode462. 最小操作次数使数组元素相等
为什么目标是中位数呢?根据中位数贪心的思想
这道题可以转化为:cost[i]是nums[i]出现的次数,然后都转化为中位数
class Solution {
public:
using ll = long long;
long long minCost(vector<int>& nums, vector<int>& cost) {
int n = nums.size();
vector<pair<int, int>> v;
for (int i = 0; i < n; ++i) {
v.push_back({nums[i], cost[i]});
}
sort(v.begin(), v.end());
ll mid = 0, sum = accumulate(cost.begin(), cost.end(), 0ll); //注意用ll定义mid
for (int i = 0; i < n; ++i) {
mid += v[i].second;
if (mid >= sum / 2) {
mid = v[i].first;
break;
}
}
ll ans = 0;//注意用ll定义ans
for (int i = 0; i < n; ++i) {
if (nums[i] != mid) ans += abs(nums[i] - mid) * 1ll * cost[i];
}
return ans;
}
};