题目:给定一个数组,可以进行两种操作刚开始x=0,可以进行两种操作1、x+1。2、a[i]+x,x+1
要求找出最小操作数,使得数组内所有数都可以整除k
思路:将数组内每个数取余k,统计出k内每种数字的个数,因为每k个数内只能有一个对应的a[i],找出数组内每种数需要的最大步数就好。
from collections import defaultdict
for _ in range(int(input())):
n , k = map(int, input().split())
a = [*map(int, input().split())]
g = defaultdict(int)
for i in a:
if i%k:
g[k-i%k]+=1
print(max(i+k*(g[i]-1)+1 for i in g)if g else 0)
超时代码:没有考虑到可以直接以一个数学式解决最大步数
from sys import stdin
input = stdin.readline
for _ in range(int(input())):
n , k = map(int, input().split())
a = [*map(lambda x: k-(x%k) ,map(int, input().split()))]
ans,g = 0,{key:a.count(key) for key in set(a)}
i,j = n - g.get(k,0), 0
while i > 0:
if g.get(j,0) >= 1:
g[j]-=1
i -= 1
j = (j+1)%k
ans += 1
print(ans)