- 题目
- 思路
- 代码实现
1、平衡的余数–1000
时间限制: | 空间限制:
题目描述:
给出一个正整数 ( 能被3整除)和一个大小为 的整数数组 。
在一次操作中,你可以选择任意一个 中的数并让它增加1。你可以对同一个位置上的数进行多次该操
作。
请求出至少需要多少步操作(可以是0次),使 中模3余 的数的个数相等。共 组测试数据。
输入格式:
第一行仅有一个正整数 ( ),表示测试数据的组数。
接下来有 组测试数据,每组共两行:
第一行仅一个正整数 ( , 能被3整除,且所有测试数据中 之和不超过
),表示数组大小;
第二行有 个整数 ( )用空格隔开。
输出格式:
对于每组测试数据,输出一行一个整数,表示至少多少次操作使 符合条件。
余数为0 1 2的传导构成了一个环,所以只需要判断一遍与平均值的关系,传导即可。
代码实现#includeusing namespace std; int t,n,ans; int cnt[3]; int main(){ scanf("%d",&t); while(t--){ ans=0; memset(cnt,0,sizeof(cnt)); scanf("%d",&n); for(int i=1;i<=n;i++){ int a; scanf("%d",&a); cnt[a%3]++; } int op=n/3; if(cnt[0]>op){ int s=cnt[0]-op; ans+=s; cnt[0]=n/3; cnt[1]+=s; } else if(cnt[0] int s=op-cnt[0]; ans+=s; cnt[2]-=s; cnt[0]=n/3; } if(cnt[2]>op){ int s=cnt[2]-op; ans+=s; cnt[0]+=s; cnt[2]=n/3; } else if(cnt[2] int s=op-cnt[2]; ans+=s; cnt[2]=n/3; cnt[1]-=s; } if(cnt[1]>op){ int s=cnt[1]-op; ans+=s; cnt[1]=n/3; cnt[2]+=s; } else if(cnt[1] int s=op-cnt[1]; ans+=s; cnt[1]=n/3; cnt[0]-=s; } printf("%dn",ans); } return 0; }