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)

/*
  AOJ 0281
  Title:Formation
  @kankichi573
*/
#include <stdio.h>
#define min(x,y) ((x)>(y)?(y):(x))

int Q;

int solve(int c,int a,int n)
{
        int ret,w;

        //printf("CAN=%d %d %d\n",c,a,n);

        if(c+a+n < 3 ||c==0)
                ret=0;
        else if(a==0 && n==0)
                ret=c/3;
        else if(n==0)
        {
                if(2*a <= c)
                        ret=a+solve(c-2*a,0,0);
                else
                        ret=c/2;
        }
        else
        {
                if(n <= c && n <= a)
                        w=min(c,min(a,n));
                        ret=w+solve(c-w,a-w,n-w);
        }
        return(ret);
}
main()
{
        int c,a,n,ret;
        int i;

        scanf("%d",&Q);
        for(i=0;i<Q;i++)
        {
                scanf("%d %d %d",&c,&a,&n);
                ret=solve(c,a,n);
                printf("%d\n",ret);
        }
        return(0);
}