总体应该算是贪心题,由于0~9都需要avg = n / 10个,所以不妨将i中多余的价值较小的数改为其他数,讨论该数没有什么意义,因为一定需要一个代价来弥补这个空缺,所以代码如下。
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 1e5 + 10;
int n;
PII p[N];
int cnt[10];
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; ++ i)
{
scanf("%d%d", &p[i].x, &p[i].y);
cnt[p[i].x] ++;
}
sort(p + 1, p + n + 1);
long long ans = 0;
int m = n / 10, begins = 1;
for (int i = 0; i <= 9; ++ i)
{
if (cnt[i] > m)
for (int j = 1; j <= cnt[i] - m; ++ j)
{
int idx = begins + j - 1;
ans = ans + 1ll * p[idx].y;
}
begins = begins + cnt[i];
}
cout << ans << endl;
return 0;
}