2022浙江工业大学程序设计迎新赛——决赛 I 题 题解

圣诞节的礼物

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了一发,悲

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值