题目大意:给定一个数组和一个数k,初始x = 0,每一步可以有两种操作,将x加到某一个数上并且x自增(即a[i] += x++;),或者只是x自增。尽量通过最少的操作次数,使得数组中每一个数都可以整除k(即a[i] % k == 0)。
题解:因为一步操作只能对一个数增加,所以相同的数字需要在下一次满足条件时增加。对于数组,先求出每一个数的目标数字,目标数组与原数组差的最大值加一就是最小操作步数。
AC代码:(memset会时间超限呦)
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
bool cmp(long long a, long long b){
return a < b;
}
int t, n;
long long k;
map<long long ,int>vis;
long long a[N], b[N];
int main(){
cin>>t;
while(t--){
cin>>n>>k;
for(int i = 1; i <= n; ++i){
cin>>a[i];
a[i] %= k;
}
sort(a+1, a+n+1,cmp);
for(int i = 1; i <= n; ++i){
if(a[i]){
vis[a[i]]++;
b[i] = vis[a[i]] * k;
}
}
vis.clear();
for(int i = 1; i <= n; ++i){
a[i] = b[i] - a[i];
}
sort(a+1, a+n+1,cmp);
if(a[n]){
cout<<a[n]+1<<endl;
}
else{
cout<<"0\n";
}
for(int i = 1; i <= n; ++i){
a[i] = 0, b[i] = 0;
}
}
}