这个题网上的大多数题解都说是思维题
其实可以用兰道定理解决
首先来说明一下兰道定理
兰道定理又称竞赛图定理,是一个定义在有向图上的概念,顾名思义,它可以想象成n个人两两对决,赢得向输的连边,其实就是给一副完全图的无向边定了方向。
定义一个竞赛图的比分序列(score sequence),是把竞赛图的每一个点的出度从小到大排列得到的序列。
一个长度为n的序列
HDU-5873
是合法的比分序列当且仅当:
但是兰道定理是赢的一方得一分,输的一方不得分,似乎跟这道题不是很符合,但是你把它改为赢的一方得两分,输的一方不得分,平局各得一分,只需要把公式后面给C(2,K)乘2就好了
所以这道题也就解决了,下面上代码
1 /* 2 加油,别忘记你写这段话时候的心情 3 如临深渊,如履薄冰 4 */ 5 #include<bits/stdc++.h> 6 #include<cstdio> 7 #include<cstring> 8 #include<vector> 9 #include<algorithm> 10 #include<cmath> 11 #include<iostream> 12 using namespace std; 13 typedef long long ll; 14 typedef unsigned long long ull; 15 const int maxn = 100005; 16 17 int a[maxn]; 18 19 int main() 20 { 21 int t; 22 while(scanf("%d",&t)!=EOF) 23 { 24 while(t--) 25 { 26 int n; 27 scanf("%d",&n); 28 for(int i = 0; i < n; i++) 29 { 30 scanf("%d",&a[i]); 31 } 32 sort(a,a+n); 33 int sum = a[0]; 34 int flag = 1; 35 for(int i = 1; i < n; i++) 36 { 37 sum += a[i]; 38 if(sum < i*(i+1)) 39 { 40 printf("F\n"); 41 flag = 0; 42 break; 43 } 44 if(sum != i*(i+1) && i == n-1) 45 { 46 printf("F\n"); 47 flag = 0; 48 break; 49 } 50 } 51 if(flag) printf("T\n"); 52 } 53 } 54 return 0; 55 }