题解:
如果没有平手选项, 赢得加一分的话, 可以用Landau's Theorem(兰道定理)判定。 稍微修改一下这个定理就能做了。
假设S1,S2……,Sn是他们的得分序列,从小到大排个序。那么这个序列要是合法。那么当且仅当
- S1+S2+……+Sn = n(n-1)
- S1+S2+……+Si >= i(i-1) ( 1 <= i < n)
其实第二条也可以理解成,第i大的得分,不可能多于2(i-1),因为你最多把剩下的队伍全部赢一边。
AC代码:
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 20000 + 5;
int T, n;
int a[maxn];
void solve()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
}
sort(a + 1, a + n + 1);
int sum = 0;
for(int i = 1; i <= n; i++)
{
sum = sum + a[i];
if(sum < i * (i - 1))
{
printf("F\n");
return ;
}
}
if(sum != n * (n - 1))
printf("F\n");
else
printf("T\n");
}
int main()
{
while(~scanf("%d", &T))
{
while(T--)
{
solve();
}
}
return 0;
}