Problem:
陣形

プログラマー養成校であるアカベ高校では、チーム戦の競技プログラマーの役割を以下の３タイプに分けています。

Ｃ：

コーダー

言語を熟知しており、コーディングを行う。

Ａ：

アルゴリズマー

論理的思考が得意であり、アルゴリズムを考える。

Ｎ：

ナビゲーター

読解力に長けており、問題の分析・デバッグをする。

この高校では以下のいずれかの陣形で３人一組のチームを構成しています。

ＣＣＡ：

バランスがとれている安定型

ＣＣＣ：

スピードを見込めるがリスクの高い速攻型

ＣＡＮ：

正確に問題を解く慎重型

競技プログラミング部のコーチであるあなたは、これらの部員をうまく組み合わせ、できるだけ多くのチームを結成できるよう、毎年気を配っています。そこで、コーダーの人数、アルゴリズマーの人数、ナビゲーターの人数が入力として与えられたとき、最大何チーム作れるかを出力するプログラムを作成してください。

入力

入力は1つのデータセットからなる。入力データは以下の形式で与えられる。

Q
c1 a1 n1
c2 a2 n2
:
cQ aQ nQ

1行目のQ(0 ≤ Q ≤ 100)はチーム数を求めたい年数である。続くQ行に各年の役割別の人数が与えられる。各行にはコーダーの人数ci(0 ≤ ci ≤ 1000)、アルゴリズマーの人数ai(0 ≤ ai ≤ 1000)、ナビゲーターの人数ni(0 ≤ ni ≤ 1000)が与えられる。

出力

年ごとに、作成できる最大のチーム数を1行に出力する。

入力例

4
3 0 0
1 1 1
9 4 1
0 1 2

出力例

1
1
4
0

Solution in C++ (judge verdict: Time Limit Exceeded)

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

#define REP(i,k,n) for(int i=k;i<n;i++)
#define rep(i,n) for(int i=0;i<n;i++)

using namespace std;

int ans;

void dfs(vector<int> x,int cnt)
{
	if(x[0] >= 3)
	{
		x[0] -= 3;
		dfs(x,cnt+1);
		x[0] += 3;
	}
	if(x[0] >= 2 && x[1] >= 1)
	{
		x[0] -= 2;
		x[1]--;

		dfs(x,cnt+1);

		x[0] += 2;
		x[1]++;
	}
	if(x[0] >= 1 && x[1] >= 1 && x[2] >= 1)
	{
		x[0]--;
		x[1]--;
		x[2]--;

		dfs(x,cnt+1);

		x[0]++;
		x[1]++;
		x[2]++;
	}

	ans = max(ans,cnt);
}

int main()
{
	int n;
	cin >> n;

	rep(i,n)
	{
		vector<int> v(3);
		rep(i,3) cin >> v[i];

		ans = 0;
		dfs(v,0);

		cout << ans << endl;
	}
	return 0;
}