MYF

HDU 5873 Football Games

题目链接

HDU 5873

题目类型:机智题

题目来源:2016 ACM/ICPC Asia Regional Dalian Online

题目分析

题目大意

有若干次世界杯,每次世界杯有若干小组赛,每个小组之间共有n只队伍,n只队伍之间两两都会比一场,平局的话两个人各得1分,赢者得2分,输的队伍不得分,现在给出你每次小组赛比完赛之后的结果,问结果是否合法

解析

没看到是多次世界杯,以至于一直在想这题有什么坑。

不过数据也是挺水的,有点醉。

先说能过题的方法,只需要考虑两个条件。第一,每个队伍的得分不能超过2*(n-1),这很好理解,每个队伍总共要比赛n-1次,全赢的情况下是2*(n-1)分。第二,总分加起来要等于n*(n-1),因为每一场比赛对总分贡献2分,总共有C(n, 2)场比赛。

其实还有另外一个条件,得到0分的队伍最多只能出现一次,得到1分的队伍最多只能出现两次,得到2分的队伍最多只能出现三次,以此类推,得到i分的队伍最多只能出现i+1次。为什么呢?这其实也很好理解,假设有两个0分的队伍,那这两个队伍之间必然有比赛,那么他俩之间要么都为1,要么一个为2一个为0,不可能存在两个都是0的情况,同理其他情况。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <set>
#include <map>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <vector>
#include <iomanip>
#include <bitset>
#include <cstring>
#include <iostream>
#include <iosfwd>
#include <deque>
#include <algorithm>
#define Memset(a,val) memset(a,val,sizeof(a))
#define PI acos(-1.0)
#define PB push_back
#define MP make_pair
#define rt(n) (i == n ? '\n' : ' ')
#define hi printf("Hi----------\n")
#define IN freopen("input.txt","r",stdin);
#define OUT freopen("output.txt","w",stdout);
#define debug(x) cout<<"Debug : ---"<<x<<"---"<<endl;
#define debug2(x,y) cout<<"Debug : ---"<<x<<" , "<<y<<"---"<<endl;
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
typedef pair<int,int> PII;
typedef long long ll;
const int maxn=100001+10;
const int mod=1000000007;
const int INF=0x3f3f3f3f;
const double eps=1e-8;
int a[maxn];
int vis[maxn];
int main(){
int T;
while (scanf("%d",&T)!=EOF) {
ll n;
while (T--) {
memset(vis, 0, sizeof(vis));
scanf("%lld",&n);
ll sum = 0,tot=0;
sum = n * (n-1);
bool flag = true;
for (int i=1; i<=n; i++) {
if (!flag) {
scanf("%*d");
continue;
}
scanf("%d",&a[i]);
if (a[i] > 2*(n-1)) flag = false;
vis[a[i]]++;
tot += a[i];
}
if (tot != sum ){
flag = false;
}
for (int i = 0; i<2*(n-1)&&flag; i++) {
if (vis[i] > i +1) {
flag = false;
}
}

if (flag) puts("T");
else puts("F");
}

}

}