两个整数拼接成一个新数字之后,如果是3的倍数,则我们定义为幸福配对。
现在有n个数字,月老的任务就是将其配对。
现在请你帮助月老计算出最多能够有多少个幸福配对。
例如:123和456可以拼接成123456,也可以组成456123。
注意:每个数字只能用一次
每组数据输入格式如下:
对于每一组数据,输入如下:
一个整数n (1<=n<=10000)
接下来一行,n个整数 a1,a2,a3……an (1<=ai<=1000000000)
Original | Transformed |
2 3 1 2 3 4 1 1 4 4
Original | Transformed |
1 0
参考程序:
#include <cstdio>
#define min(x, y) (x < y ? x : y)
int main()
{
int cases;
scanf("%d", &cases);
while(cases--)
{
int n;
scanf("%d", &n);
int rem0, rem1, rem2;
rem0 = rem1 = rem2 = 0;
for (int i = 0; i < n; ++i)
{
int a1;
scanf("%d", &a1);
if(a1 % 3 == 0)
++rem0;
if(a1 % 3 == 1)
++rem1;
if(a1 % 3 == 2)
++rem2;
}
printf("%d\n", rem0 / 2 + min(rem0, rem1));
}
return 0;
}
解题思路:这一题用到了一些数学知识和技巧,我们上小学的时候也许就知道了凡是能整除3的数,它的每位数字加起来也一定是3的倍数,这一题就用到了这一点。若两个数能配对成功,那么这两个数加起来就能整除3。关于这一点的利用,这里有个小技巧,就是求余。这些数可以分成除以3的余数分别是0、1、2这三类,只有余数是1和余数是2的数、余数是0的两个数配对,才能配对成功。所以这里用rem0、rem1、rem2三个变量分别来计数余数是0、余数是1、余数是2这三类数,所以总的配对成功数就是rem0 / 2 + min(rem0, rem1)。
易错点:1、没想到这点数学知识,导致计算麻烦或者算不出来。
2、没有将这点数学知识和求余联系到一起。