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;
}