1. 选靓号

import functools

def cost(target, k):  # 计算改成k个target的最小代价
    costList = [0] * len(phone)
    for i,x in enumerate(phone):
        costList[i] = abs(target-x)
    return sum(sorted(costList)[:k])

def myCmp(x,y):     # 修改优先级排序
    if abs(x[1])<abs(y[1]):return -1
    elif abs(x[1])>abs(y[1]):return 1
    else:
        if x[1]>0 and y[1]<0:return -1  # 先改让数字变小的
        elif x[1]<0 and y[1]>0: return 1
        else:
            if x[1]<0:          # x,y同样变大,先改后面的
                if x[0]>y[0]: return -1
                else: return 1
            else:            # x,y同样变小,先改前面
                if x[0]<y[0]: return  -1
                else: return 1
 
n, k = map(int, input().split())
phone = list(map(int,list(input())))               
mi,ma = min(phone),max(phone)
targetNum,miCost = 0,sum(phone)
for x in range(mi,ma+1):  # 确定修改的target
    tempCost = cost(x,k)
    if tempCost<miCost:
        miCost,targetNum = tempCost,x
dis = [(i,x-targetNum) for i,x in enumerate(phone)]   # (下标,修改代价)
order = sorted(dis, key=functools.cmp_to_key(myCmp))[:k]
for x in order:
    phone[x[0]] = targetNum
print(miCost)
print("".join(map(str,phone)))
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值