题意:
给你n个人之间的关系,如果超过三个人之间互相认识,或者超过三个人之间互相不认识,则输出“Bad Team!”,否则输出“Great Team!”
思路:
用邻接表降低内存,分别算认识的情况和不认识的情况。以认识的情况为例,从第一个人开始判断,如果这个人与>1个人认识,则判断这几个人存不存一组互相认识的情况,然后优化一下就能过了,(发现只考虑认识的也能过··交第一发的时候只写了认识的情况看看有没有超时,然后竟然a了···而且多考虑不认识的竟然跑的更快!,,???)
代码:
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
vector<int> arr[3001];
vector<int> brr[3001];
//int temp[3001];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i = 1;i<=3000;i++)
arr[i].clear();
for(int i = 1;i<=3000;i++)
brr[i].clear();
for(int i = 1;i<n;i++)
{
for(int j = 1;j<=n-i;j++)
{
int num;
scanf("%d",&num);
if(num==1)
arr[i].push_back(j+i);
else
brr[i].push_back(j+i);
}
}
int flag = 0;
for(int i = 1;i<n&&flag==0;i++)
{
int len = arr[i].size();
if(len>1)
{
for(int k = 0;k<len-1&&flag==0;k++)
{
int next = arr[i][k];
int l = arr[next].size();
for(int m = 0;m<l&&flag==0;m++)
{
int maxx = arr[next][m];
for(int j = k+1;j<len;j++)
{
if(arr[i][j]==maxx)
{
flag = 1;
printf("Bad Team!\n");
break;
}
if(arr[i][j]>maxx)
break;
}
}
}
}
}
if(flag==0)
{
for(int i = 1;i<n&&flag==0;i++)
{
int len = brr[i].size();
if(len>1)
{
for(int k = 0;k<len-1&&flag==0;k++)
{
int next = brr[i][k];
int l = brr[next].size();
for(int m = 0;m<l&&flag==0;m++)
{
int maxx = brr[next][m];
for(int j = k+1;j<len;j++)
{
if(brr[i][j]==maxx)
{
flag = 1;
printf("Bad Team!\n");
break;
}
if(brr[i][j]>maxx)
break;
}
}
}
}
}
}
if(flag==0)
printf("Great Team!\n");
}
return 0;
}