根据题意,数组中的每个数字均要出现$n/10$次,而对于一些出现次数超过$n/10$次数字必然要进行更改,直到当前数字的出现次数为$n/10$次为止;对于一些不足$n/10$个的数字,必定可以通过其他数字的更改得到。对于要更改的数字,当然是希望它所花的代价越小越好,所以每次尽量更改代价比较小的数字即可。
C++代码:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int N = 1e5 + 10, M = 10;
PII nums[N];
vector<int> cost[M]; // 用来存每个数字更改
int n;
int main()
{
scanf("%d", &n);
for(int i = 0; i < n; i ++) scanf("%d%d", &nums[i].first, &nums[i].second);
sort(nums, nums + n); // 按每个数字所需要的代价从小到大排序
for(int i = 0; i < n; i ++) cost[nums[i].first].push_back(nums[i].second);
int t = n / 10; // 每个数字应该出现的次数
LL res = 0;
for(int i = 0; i < 10; i ++)
{
int x = cost[i].size();
if(x > t) // 对出现超过t次的数字进行更改
for(int j = 0; j < x - t; j ++)
res += cost[i][j];
}
printf("%lld", res);
return 0;
}
nb
强,我就想不到这样的,搞了好多数组
大哥,好强
赞