【问题描述】
有一个长度为n的数组(n是10的倍数),每个数 Ai 都是区间[0,9]中的整数,小明发现数组里每种数出现的次数不太平均,而更改第 i 个数的代价为bi,他想更改着若干个数的值使得这 10 种数出现的次数相等(都等于n/10,请问代价和最少为多少。
【输入格式】
输入的第一行包含一个正整数 n。
接下来n行,第i行包含两个整数ai,bi,用一个空格分隔。
【输出格式】
输出一行包含一个正整数表示答案。
【样例输入】
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。
【评测用例规模与约定】
对于20%的评测用例,n<=1000;
对于所有评测用例n <= 100000,0<bi<=2×10^5。
python
def main():
# 读取第一个整数n,表示后续将有n个整数对
n = int(input())
# 初始化列表lst用于存储整数对,字典dic用于记录每个分类标签的数量
lst = []
dic = {}
# 计算每个分类需要忽略的最大数值数量(取整),由于Python 3中/运算得到浮点数,这里用//确保得到整数
num = n // 10
# 读取n个整数对,并将它们添加到lst列表中,同时更新dic字典中分类标签的数量
for _ in range(n):
a, b = map(int, input().split())
lst.append((a, b))
if a in dic:
dic[a] += 1
else:
dic[a] = 1
# 以代价大小(即整数对的第二个元素)进行排序
lst = sorted(lst, key=lambda x: x[1])
# 初始化结果变量value
value = 0
# 遍历排序后的整数对列表,根据条件累加代价到value中
for a, b in lst:
if dic[a] > num:
value += b
dic[a] -= 1
# 输出结果
print(value)
# 调用主函数
if __name__ == "__main__":
main()