题目描述:
思路: 贪心
题目要求0--9每个数出现的次数都为n/10。若一个数出现的个数为k , k > n/10的话需要将k - n/10的多余部分转换为其他数。这个操作我们贪心处理,优先将转换花费小的元素转换。这样可以得到最小花费。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
// #define int long long
#define ios ios::sync_with_stdio(false); cin.tie(0);cout.tie(0)
const int N = 1e5+5;
int n;
struct node{
int v, c;
}a[N];
ll psum[N];
void solve(){
cin >> n;
ll res = 0;
for(int i = 1; i <= n; i++){
cin >> a[i].v >> a[i].c;
}
sort(a + 1, a + 1 + n, [&](node &a, node &b) -> bool{
if(a.v != b.v) return a.v < b.v;
else return a.c < b.c;
});
int k = n/10;
ll cnt = 0;
for(int i = 1; i <= n - 1; i++){
if(a[i].v == a[i + 1].v){
++cnt, psum[cnt] = psum[cnt - 1] + a[i].c;
}else{
if(cnt >= k){
res += psum[cnt - k + 1];
}
cnt = 0;
}
}
if(cnt >= k) res += psum[cnt - k + 1];
cout << res << endl;
}
signed main(){
ios; int _;
_ = 1; //cin >> _;
while(_--){
solve();
}
return 0;
}