记录一道关于数学知识的题目:(也是一种看待数字的方式) 题目:
给您一个由n个整数a1,a2,…,an组成的数组 。 在一个操作中,您可以选择数组中的两个元 素,然后用等于其总和的元素替换它们(插入新元素的位置无关紧要)。例如,从数组[2,1,4] 您 可以获得以下数组:[3,4],[1,6]和[2,5] 。 您的任务是找到执行此操作任意次(可能为零)次后, 数组中能被3整除的元素个数的大值。
The first line contains one integer t (1 <=t <= 1000) — the number of queries.
The first line of each query contains one integer n (1 <= n <= 100).
The second line of each query contains n integers a1, a2, … , an (1 <= ai <= 10^9).
For each query print one integer in a single line — the maximum possible number of elements divisible by 3 that are in the array after performing described operation an arbitrary (possibly, zero) number of times.
Input 2 5 3 1 2 3 1 7 1 1 1 1 1 2 2 Output 3 3
这题的主要思想就是给你一个数组,可以对其中的元素进行任意次的求和操作,要求求出在最终的结果数组中的能被3整除的元素的总的个数,在这道题题中,可以将每个数字都看作是两部分,一部分是可以被3整除的部分,一部分是不能被三整除的部分(第二部分只有0,1,2这三种情况) 对于第二部分为0的那些数字可以先提取出来,这些是不用被修改即可被3整除的数字,对剩下的数字,去第二部分为1的和为2的这两部分的数字求和,即可使数字变得可被3整除,对最后剩下的第二部分为1和2的数字可以对它们分别处以3来陪出3的整数倍,最终结果求和即可,代码:
#include<bits/stdc++.h> using namespace std; const int N = 1e5 + 10; long long Num[N]; int main(void) { ios::sync_with_stdio(false); cin.tie(0); int t; cin >> t; while(t -- ) { int n; cin >> n; int rest[3] = {0}; for(int i = 0;i < n;i++) { cin >> Num[i]; rest[Num[i] % 3] ++ ; } int nt = rest[0]; int m = min( rest[1] , rest[2] ); nt += m; rest[1] -= m,rest[2] -= m; nt += (rest[1] / 3) + (rest[2] / 3); cout << nt << endl; } return 0; }