第十四届蓝桥杯大赛软件赛省赛Python 大学 C 组:4.平均

题目1 平均

有一个长度为 n 的数组(n 是 10 的倍数),每个数 ai 都是区间 [0,9] 中的整数。

小明发现数组里每种数出现的次数不太平均,而更改第 i 个数的代价为 bi,他想更改若干个数的值使得这 10 种数出现的次数相等(都等于 n10),请问代价和最少为多少。

输入格式

输入的第一行包含一个正整数 n。

接下来 n 行,第 i 行包含两个整数 ai,bi,用一个空格分隔。

输出格式

输出一行包含一个正整数表示答案。

数据范围

对于 20% 的评测用例,n≤1000;
对于所有评测用例, n ≤ 1 0 5 , 0 < b i ≤ 2 × 1 0 5 n≤10^5,0n1050<bi2×105

输入样例:
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。

思路

贪心

  • 知道每一个数字都是[0,9],所以开一个二维列表存储,每一个输入的代价
  • 对代价进行排序与计算,k==要求的个数(n//10)
    • 如果数字数量小于等于k,不计算
    • 数字数量大于k,修改前面的部分(代价最小)

python代码

n=int(input())
data=[[]for _ in range(n)]
ave=n//10
for i in range(n):
    a,b=map(int,input().split())
    data[a].append(b)
for i in range(n):
    data[i].sort()
ans=0
for i in range(n):
    if len(data[i])>ave:
        ans+=sum(data[i][:-ave])
print(ans)

知识点

蓝桥杯笔记:蓝桥杯备赛笔记

  1. sum(data[i][:-ave]):对data[i][-ave]之前的元素求和

你可能感兴趣的:(蓝桥杯,蓝桥杯,python,算法,职场和发展)