一、题目:
二、大体思路:
1、最小的办法:多的->少的
2、找出每个数的出现机会
3、因为最小 所有 单个数的代价最小 总和最小
三、代码如下:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long LL;
/*大体思路:
1、最小的办法:多的->少的
2、找出每个数的出现机会
3、因为最小 所有 单个数的代价最小 总和最小
*/
int main()
{
int n;
cin >> n;
vector<int> w[10]; //定义一个二维数组 第一维10个数 后面是小弟
for (int i = 0; i < n; i ++ )
{
int a,b;
scanf("%d%d", &a, &b);
w[a].push_back(b); //存入小弟
}
LL res = 0; //int的话会爆
int avg = n / 10; //根据题意每个数出现的机会是n/10;
for (int i = 0; i < 10; i ++ )
{
if(w[i].size() > avg) //比较一下一个数字的出现次数是否超过的平均值
{
sort(w[i].begin(),w[i].end()); //给小弟们排个序
for(int j=0;j<w[i].size()-avg;j++) //找出前面最小的
{
res = res + w[i][j]; //累加
}
}
}
cout << res;
return 0;
}