题意:本题就是给你n,m,保证n能被m整除,给你n个数,对这些数操作+=1,使得这些数%m后,得到的数是从0~m-1,且没个数出现n/m次。
题解:贪心,对于数量少的先不处理,对于多于n/m的数使其变为离他最近的数量不到n/m的数,记录需要操作的次数,跑一边就可以得到结果;
AC代码为:
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
const int INF=0x3f3f3f3f;
typedef long long LL;
vector<int> v[maxn];
int a[maxn],n,m;
LL ans;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;ans=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
v[a[i]%m].push_back(i);
}
int temp=0,flag=n/m;
for(int i=0;i<m;i++)
{
while(v[i].size() > flag)
{
temp=max(temp,i);
while(v[temp%m].size()>=flag) temp++;
int num=min(flag-v[temp%m].size(),v[i].size()-flag);
int c_num=temp-i;
while(num--)
{
ans+=c_num;
a[v[i].back()]+=c_num;
v[temp%m].push_back(v[i].back());
v[i].pop_back();
}
}
}
cout<<ans<<endl;
for(int i=0;i<n;i++) i==n-1? cout<<a[i]<<endl : cout<<a[i]<<" ";
return 0;
}