圣诞节的礼物
Description
小 y 希望能收到收到圣诞节的礼物,但拆开礼物盒发现只有一个数字3,碰巧的是家里有一个长度为 n 的序列(保证 n 为偶数),于是她想把这些数重新发给其他人。
现将这些数两两分成2n 组,每个数只能出现在一组中,然后再将各组的数拼接起来形成一个新数(任意拼接方式,比如该组数为 a 和 b,则可以形成 ab 或 ba),然后将这个数当作礼物送给其他人。小 y 发出一个值为 x 的礼物时会收获 x mod 3 的愉悦感,请你确定分组方式和各组的拼接方式,求所有愉悦感的和在 mod3 下的最小值。
Input
第一行包含一个数字表示有 T(1≤T≤5×10^4) 组测试数据。
接下来 T 组数据,每组数据的第一行包含一个正整数 n(2≤n≤2×10^5),表示序列的长度,保证 n 为偶数。
每组数据的第二行包含 n 个由空格隔开的正整数 a1,a2,⋯,an (1≤ai≤10^9),描述序列中每个元素的值。
对于总共 T 组数据,保证∑n≤2×10^5。
Output
输出共 T 行,对于每组测试数据输出一行,表示该组测试数据的答案。
Sample Input 1
1 2 2 2
Sample Output 1
1
Hint
将两个 2 分成 1 组,可以拼接得到新数字 22,答案为22mod3=1。在此样例中,只有这一种分配方式,因此是最小的。
利用两位数字相加能否整除三来判断,要建三种情况
for(int i=1;i<=n;i++)
{
cin >> a[i];
if(a[i]%3==0)
cnt3++;
else if(a[i]%3==1)
cnt1++;
else if(a[i]%3==2)
cnt2++;
}
下面就要对这三种情况分别讨论,1和2可以组合到一起整除以三,剩下的全是1或2或者二者都没有
下面是完整代码:
#include<bits/stdc++.h>
using namespace std;
const int N=200010;
int a[N];
int main()
{
int t;
cin >> t;
while(t--)
{
int n,sum=0;
int cnt1=0,cnt2=0,cnt3=0;
cin >> n;
for(int i=1;i<=n;i++)
{
cin >> a[i];
if(a[i]%3==0)
cnt3++;
else if(a[i]%3==1)
cnt1++;
else if(a[i]%3==2)
cnt2++;
}
cnt3=cnt3%2;
if(cnt2>cnt1)
{
if(cnt3==0)
sum=(cnt2-cnt1)/2;
else
sum=(cnt2-cnt1-1)/2+2;
}
else
sum=(cnt1-cnt2);
sum=sum%3;
cout<<sum<<endl;
}
}
别忘记结尾要mod3,我就因为忘记了wa了一发,悲