http://acm.hdu.edu.cn/showproblem.php?pid=5873
题意:
现在有比赛,所有队伍两两进行比赛,赢的积2分,输的积0分,如果平局的话就各自都积1分,现在给出每只队伍的得分情况,判断是否合法。
思路:
竞赛图中有关于得分序列这方面的知识,这里引用一下来自http://blog.csdn.net/a_crazy_czy/article/details/73611366博主的讲解。
那么,对于这道题目来说,首先对所有得分排个序,再依次处理即可,前i只队伍的得分情况必须得大于等于$i*(i-1)$,因为每次比赛都会使得总分+2分,而当i=n时,也就是判断到最后一支队伍时,必须要等于$n*(n-1)$。
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 typedef long long ll; 6 const int maxn=20000+5; 7 8 int n; 9 int a[maxn]; 10 11 int main() 12 { 13 //freopen("in.txt","r",stdin); 14 int T; 15 while(~scanf("%d",&T)) 16 { 17 while(T--) 18 { 19 bool flag=true; 20 scanf("%d",&n); 21 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 22 sort(a+1,a+n+1); 23 int sum=0; 24 for(int i=1;i<=n;i++) 25 { 26 sum+=a[i]; 27 if(i<n) 28 { 29 if(sum<i*(i-1)) {flag=false;break;} 30 } 31 else 32 { 33 if(sum!=i*(i-1)) flag=false; 34 } 35 } 36 if(flag) puts("T"); 37 else puts("F"); 38 } 39 } 40 return 0; 41 }
时间: 2024-10-13 06:35:48