Description
n支队伍比赛,每支队伍要和其他n-1支队伍各比一场,赢得两分,输得0分,平各得一分,现给出n支队伍的最终得分,问是否存在满足此得分的情况
Input
多组用例,每组用例首先输入一整数T表示得分情况数,之后T行每行首先输入一整数n表示队伍数,之后n个非负整数ai表示每个队的得分
(用例组数<=10,T<=100,n<=20000,ai<=20000)
Output
对于每个得分情况,判断其是否有可能合法
Sample Input
2
3 0 5 1
2 1 1
Sample Output
F
T
Solution
根据Landau定理,对于一个循环比赛计分问题,一个序列s是合法的分数序列当且仅当:
1.0<=s1<=s2<=…<=sn
2.s1+s2+…+si>=C(i,2),i=1,2,…,n-1
3.s1+s2+…+sn=C(n,2)
此题由于每次胜者得2分且有平局情况,所以对以上定理稍作改变,每次判断s1+s2+…+si>=i*(i-1),i=1,2,…,n-1以及s1+s2+…+sn=n*(n-1)
Code
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
#define maxn 22222
int T,n,a[maxn];
int main()
{
while(~scanf("%d",&T))
{
while(T--)
{
scanf("%d",&n);
ll sum=0;
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
sort(a+1,a+n+1);
int flag=1;
for(int i=1;i<=n;i++)
{
sum+=a[i];
if(sum<1ll*i*(i-1))flag=0;
if(i==n&&sum!=1ll*n*(n-1))flag=0;
if(!flag)break;
}
printf("%c\n",flag?'T':'F');
}
}
return 0;
}