原题链接AcWing 5395. 平均 https://www.acwing.com/problem/content/5398/
算法标签:贪心
分析思路:
由题意可知,我们需要让出现过的数的数量一致,并且要付出最小的代价。这样就有四种情况:多->多(少->多->多)、少->少(多->少->少)、多->少、少->多(多->少->多)。由此可知多->少才存在最优解,因为代价都是大于零的。
代码实现:
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N=10;
vector<int>w[N];
int n;
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
w[a].push_back(b);
}
int res=n/10;
LL d=0;
for(int i=0;i<10;i++)//[0,9]区间取数字
{
if(w[i].size()>res)
{
//排序
sort(w[i].begin(),w[i].end());
for(int j=0;j<w[i].size()-res;j++)
{
d+=w[i][j];
}
}
}
printf("%lld",d);
return 0;
}