有一个长度为 n 的数组(n 是 10的倍数),每个数 ai都是区间 [0,9] 中的整数。
小明发现数组里每种数出现的次数不太平均,而更改第 i个数的代价为 bi,他想更改若干个数的值使得这 10 种数出现的次数相等(都等于 n/10),请问代价和最少为多少。
输入格式
输入的第一行包含一个正整数 n。
接下来 n 行,第 i 行包含两个整数 ai,bi用一个空格分隔。
输出格式
输出一行包含一个正整数表示答案。
数据范围
对于 20%的评测用例,n≤1000;
对于所有评测用例,n≤10^5,0<bi≤2×10^5。
输入样例:
10 1 1 1 2 1 3 2 4 2 5 2 6 3 7 3 8 3 9 4 10
输出样例:
27
样例解释
只更改第 1,2,4,5,7,8个数,需要花费代价 1+2+4+5+7+8=27。
思路:
看下图,要使得总体平均
1.多出的数字不可能变成多的数字,比如0变成2
2.少的数字也不可能变成多的数字,比如1变成0
3.少的数字也不可能变成少的数字,比如1变成3
因为即使又上述情况,也仅仅是其中一种方式的过程,可以一步到位拆成了两步;
所以这里只能由多的变成少的。
完整代码:
完整代码:
#include <iostream> using namespace std; typedef long long ll; #include <algorithm> #include <vector> vector<int> w[10]; int main(){ int n,a,b; cin>>n; for(int i=0;i<n;i++) { cin>>a>>b; w[a].push_back(b); } ll res=0; int avg=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+=w[i][j]; } } } cout<<res; }