思路:先去统计原数组,除以3余数为0, 1, 2的个数。
然后,在一重循环,当c0!=c1!=c2时就执行,观察发现,
每次只需贪心的让三个数中最大的数去减少即可,
又发现,如果c0最大,则让c0–(让一个余数是0的数加1即可),这样c1就会++,另外两个依此类推。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=3e4+10;
int T;
int n;
int a[N];
signed main()
{
cin>>T;
while(T--)
{
scanf("%d", &n);
int c0=0, c1=0, c2=0;
for(int i=0;i<n;i++)
{
scanf("%d", &a[i]);
if(a[i]%3==0) c0++;//统计余数个数
else if(a[i]%3==1) c1++;
else if(a[i]%3==2) c2++;
}
int res=0;//操作次数
while(c0!=c1||c0!=c2||c1!=c2)
{
res++;
if(c0>=c1&&c0>=c2) c0--, c1++;
else if(c1>=c0&&c1>=c2) c1--, c2++;
else if(c2>=c0&&c2>=c1) c2--, c0++;
}
printf("%d\n", res);
}
}