您将获得一个数字n(可分割3)和一个数组a=1.。。 n] .一举一动,您可以将任何数组元素逐一增加。 从形式上讲,您选择指数 i (1≤i ≤n),并以 ai+1 替换 ai 您可以多次选择同一指数 i 以进行不同的移动。
让我们用 c0、c1 和 c2 表示阵列 a 中剩余的 0、1 和 2 的数字,如果除以数字 3。 假设如果 c0、c1 和 c2 是相等的,则阵列 aa 具有平衡的剩余部分。
例如,如果 n=6 和 a=0,2,5,5,4,8],则可以进行以下移动序列:
- 最初 c0=1、c1=1 和 c2=4,这些值彼此不等于。让我们增加 a3, 现在阵列 a =0, 2, 6, 5, 4, 8]
- c0=2c1=1 和 c2=3,这些值不相等。 让我们增加 a6,现在阵列 a=0,2,6,5,4,9];
- c0=3、c1=1 和 c2=2,这些值不相等。 让我们增加 a1, 现在阵列 a =1,2,6,5,4,9]
- c0=2、c1=2 和 c2=2,这些值彼此相等,这意味着阵列 a 具有平衡的剩余部分。
查找使阵列 a 具有平衡剩余部分所需的最小移动数。
输入
第一行包含一个整数 t (1≤t≤10+4 )。 然后tt测试案例如下。
每个测试案例的第一行包含一个整数 n (3≤n≤3⋅10+4) - 阵列 a 的长度。 它保证数字n可除以3。
下一行包含 n 整数 a1,a2,...,an (0≤ai≤100)。
保证所有试用案例的n总和不超过15万。
输出
对于每个测试案例,输出一个整数-aa阵列必须进行的最低移动次数,使其具有平衡的剩余部分。
例
输入
4 6 0 2 5 5 4 8 6 2 0 2 1 0 0 9 7 1 3 4 2 10 3 9 6 6 0 1 2 3 4 5
输出
1. 3 2. 1 3. 3 4. 0
注意
第一个测试案例在陈述中解释。
在第二个测试案例中,您需要为 i=2 移动一个动作
第三个测试案例需要进行三个动作:
- 第一步: i=9
- 第二步:i=9
- 第三个动作:i=2。
在第四个测试案例中,值 c0、c1 和 c2 最初相互等于,因此阵列 a 已具有平衡的剩余部分。
题目分析就是枚举所有情况依次增减,具体实现看代码。
听懂了记得给个赞鼓励一下,码字不易,用爱发电。
上ac代码。
有事你就q我;QQ2917366383
学习算法
#include<bits/stdc++.h> using namespace std; int a[100000]; int n;int t; int main(){ cin>>t; while(t--){ int c0=0,c1=0,c2=0; cin>>n; int ans = 0; for(int i=0;i<n;i++){ cin>>a[i]; if(a[i]%3==0) c0++; else if(a[i]%3==1)c1++; else c2++; } while(c0!=c1||c0!=c2||c1!=c2) { ans++; if(c0>=c2&&c0>=c1){ c0--; c1++; } else if(c1>=c2&&c1>=c0){ c1--; c2++; } else{ c2--; c0++; } } cout<<ans<<endl; } }