题目:
A 国的手机号码由且仅由 N 位十进制数字(0-9)组成。一个手机号码中有至少 K 位数字相同则被定义为靓号。A 国的手机号可以有前导零,比如 000123456 是一个合法的手机号。 小多想花钱将自己的手机号码修改为一个靓号。修改号码中的一个数字需要花费的金额为新数字与旧数字之间的差值。比如将 1 修改为 6 或 6 修改为 1 都需要花 5 块钱。 给出小多现在的手机号码,问将其修改成一个靓号,最少需要多少钱?
My answer:
通过55%的算例。
line1=list(map(int,input().split()))
N,K=line1[0],line1[1]
number=str(input())
zd={}
li_ori=[]
for ele in number:
ele=int(ele)
li_ori.append(ele)
if ele not in zd.keys():
zd[ele]=1
else:
zd[ele]+=1
'''
if max(zd.values())>=K:
print('0')
print(number)'''
min_money=float('inf')
for x in zd.items():
newzd=sorted(zd.items(),key=lambda y:abs(y[0]-x[0]))
money=0
count=K-x[1]
change=[]
idx=1
while count>0:
t=min(newzd[idx][1],count)
change.append((newzd[idx][0],t))
money+=abs(newzd[idx][0]-x[0])*t
idx+=1
count-=t
#print(money)
#print(change)
li=[e for e in li_ori]
if money<=min_money:
if money<min_money: #如果money
min_answer=[float('inf')]*N
min_money=money
#print(change)
for ele in change:
if ele[0]>x[0]:
#print(li)
tmp_li=[x for x in li]
for j in range(ele[1]):
ind=tmp_li.index(ele[0])
tmp_li[ind]=x[0]
li=[x for x in tmp_li]
#print(li)
else:#ele[0]>x[0]
#print(li)
tmp_li=[x for x in li[::-1]]
#print(tmp_li)
for j in range(ele[1]):
ind=tmp_li.index(ele[0])
tmp_li[ind]=x[0]
#print(tmp_li)
li=[x for x in tmp_li[::-1]]
if li<min_answer:
min_answer=li
print(min_money)
for i in min_answer:
print(i,end='')
参考答案
def distance(dic, k, t):
ret = 0
if dic[t] >= k: return ret
k -= dic[t]
for i in range(1, 10):
if t + i < 10:
if dic[t + i] >= k:
ret += i * k
return ret
else:
k -= dic[t + i]
ret += i * dic[t + i]
if t - i >= 0:
if dic[t - i] >= k:
ret += i * k
return ret
else:
k -= dic[t - i]
ret += i * dic[t - i]