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)

using System;

namespace AOJ.Volume2
{
    public class Formation
    {
        public static int Main()
        {
            int cnt = int.Parse(Console.ReadLine());
            for(int i = 0; i < cnt; i++)
            {
                var input = Console.ReadLine().Split(' ');
                int c = int.Parse(input[0]);
                int a = int.Parse(input[1]);
                int n = int.Parse(input[2]);

                int answer = 0;
                for(int j = 0; j <= 2; j++)
                {
                    answer = Math.Max(answer, Solve(c, a, n, j, 0));
                }

                Console.WriteLine(answer);
            }

            return 0;
        }

        private static int Solve(int c, int a, int n, int type, int count)
        {
            switch (type)
            {
                case 0:
                    // CCA
                    c = c - 2;
                    a = a - 1;
                    break;
                case 1:
                    // CCC
                    c = c - 3;
                    break;
                case 2:
                    // CAN
                    c = c - 1;
                    a = a - 1;
                    n = n - 1;
                    break;
            }
            if (c < 0 || a < 0 || n < 0) { return count; }

            int ret = 0;
            count++;
            for (int i = 0; i <= 2; i++)
            {
                ret = Math.Max(ret, Solve(c, a, n, i, count));
            }

            return ret;
        }
    }
}