题目链接:
http://acm.split.hdu.edu.cn/showproblem.php?pid=5873
Hint:
题意:
有mm组球队, 每组有bib?i??支球队. 每组之间两两踢球, 赢得加2分, 平手各加1分, 输的不得分. 现在告诉你每组里面每只球队最后的分数, 问这个分数序列是否正确.
题解:
如果没有平手选项, 赢得加一分的话, 可以用Landau‘s Theorem判定, 这题稍微修改下这个定理就好了. 令s1s2...sns?1??,s?2??,...,s?n??是他们的得分序列, 从小到大拍个序, 使得s1s2...sns?1??≤s?2??≤...≤s?n??, 那么这个序列合法, 当且仅当:
s1s2...siii1s?1??+s?2??+...+s?i??≥i(i−1), 对于所有1in11≤i≤n−1s1s2...snnn1s?1??+s?2??+...+s?n??=n(n−1).比赛的时候题目没看清楚,对于0的时候的特判也给忘了,唉。
代码:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 20000+10;
#define met(a,b) memset(a,b,sizeof(a))
typedef long long ll;
ll a[maxn];
int main()
{
int t;
while(scanf("%d",&t)!=EOF)
{
while(t--)
{
ll n;
scanf("%lld",&n);
ll sum=0,sum1,sum2;
sum1=2*(n-1);
sum2=n*(n-1);
int flag=0;
for(ll i=0;i<n;i++)
{
scanf("%lld",&a[i]);
if(a[i]>sum1)
flag=1;
sum+=a[i];
}
if(n==0)
{
if(a[0]!=0)
flag=1;
}
if(sum!=sum2)
flag=1;
sort(a,a+n);
ll ans=0;
for(ll i=n-1;i>=0;i--)
{
if(a[i]>ans+i*2)
{
flag=1;
break;
}
else
ans+=(i*2-a[i]);
}
if(flag)
printf("F\n");
else
printf("T\n");
}
}
}
2016 ACM/ICPC Asia Regional Dalian Online 1006 Football Games
原文:http://www.cnblogs.com/TAT1122/p/5860206.html