题目:http://codeforces.com/contest/1176/problem/B
题目大意:对于一个数列,任意个数自由合并(求和),问最多可以有多少个数(数必须是3倍数,否则不算。)
解题思路:
如果想最多:
1)显然若是3的倍数,则不变。
2)如果对3的余数是1,则需要是一个对3的余数是2的合并就行了。同理,余数为2需要1个余数为1的合并。
3)当没有余数1或2的进行合并。那就要考虑3个余数是1或2的合并问题了。
若ni表示余数为i的个数。显然最终结果是:n0+min{n1,n2}+ |n2-n1|/3
参考代码如下:
#include <iostream> using namespace std; int main() { int t; cin>>t; while(t--) { int n; cin>>n; int a[3]={0,0,0}; while(n--) { int ai; cin>>ai; a[ai%3]++; } int cc=a[0]; if(a[1]<a[2]) cc+=a[1]+(a[2]-a[1])/3; else cc+=a[2]+(a[1]-a[2])/3; cout<<cc<<endl; } return 0; }