https://vjudge.net/problem/HDU-6152
我也是绝望啊 怎么写怎么超时 居然是人数大于6就直接是bad team了。

证明:先从6个人中选出一个人,他与另外5人要么认识,要么不认识。 所以至少有3个人对于他是一样的(至少有三个人他都认识或都不认识)。 假设这3个人他都认识。 再看这三个人,若是他们三个中有两个人认识,则这两个人已经与第一个人组成3个人,互相都认识;若是他们三个中两两都不认识,则他们三个人两两都不认识。
用图形来表达也许会更好:
假设6个人是6个点,其中两个人认识就用红色线段连线;若不认识就用黄色线段连线。只需证“其中必有一个同色三角形”那么从第一个人引出的5条线段必有3条同色。再从这3条同色的端点看,若其中两点的线段与前相同,则构成同色三角形;若这3个点两两相连的线段都与前异色,则这三个点同色,构成同色三角形。

#include<iostream>
#include<cstring>
using namespace std;
bool a[3000][3000];
int main()
{
    int T;
    cin >> T;
    while(T--)
    {
        int n;
        cin >> n;
        memset(a,false,sizeof(a));
        for(int i = 1 ; i <= n-1 ; i++)
        {
            for(int j = 1 ; j <= n-i ; j++)
            {
                cin >> a[i][j];
            }
        }
        if(n >= 6)
        {
            cout<<"Bad Team!"<<endl;
            continue;
        }
        bool ans = false;
        for(int i = 1 ; i <= n-2 ; i++)
        {
            for(int j = 1 ; j <= n-i-1 ; j++)
            {
                if((a[i][j]&&a[i][j+1]&&a[j+i][1])||(!a[i][j]&&!a[i][j+1]&&!a[j+i][1]))
                {
                    ans = true;
                    if(ans) break;
                }
            }
            if(ans) break;
        }
        if(ans){ cout <<"Bad Team!"<<endl;}
        else {cout<<"Great Team!"<<endl;}
    }
    return 0;
}