大家一起做训练 第一场 B Tournament
题目来源:CodeForce #27 B
有n个人比赛,两两之间都有一场比赛,一共 n * (n - 1) / 2 场比赛。每场比赛的记录方式是 a b,表示在a和b的比赛中,a胜出,b失败。
经过研究发现,输赢有传递性,例如:a赢了b,b赢了c,那么a一定会赢c。
现在,比赛记录发现丢了一场,请输出这一场的比赛记录。输出可能的结果中的一个就OK。
直接暴力可做。首先,利用一个二维数组,记录两人是否比赛。得到了丢失了一场比赛的两位选手a, b之后,按照输赢的传递性直接找有没有出现一个人c。使得 a 赢了 c, c 赢了 b 。有就输出a b,没有就b a。
附AC代码:
1: #include <stdio.h>
2: #include <iostream>
3: #include <math.h>
4: #include <stdlib.h>
5: #include <string.h>
6: #include <algorithm>
7: #include <string>
8: #include <vector>
9: 10: using namespace std;
11: 12: struct R
13: {14: int win, los;
15: }; 16: 17: int main()
18: {19: int n, win, los;
20: int rec[59][59];
21: while(~scanf("%d", &n))
22: {23: memset(rec, 0, sizeof(rec));
24: for (int i = 1; i < (n*(n-1)/2); i++)
25: {26: scanf("%d%d", &win, &los);
27: rec[win][los] = 1; 28: rec[los][win] = -1; 29: } 30: R res;31: bool flag = 1;
32: for (int i = 1; i <= n && flag; i++)
33: {34: for (int j = 1; j <= n && flag; j++)
35: {36: if (i == j) continue;
37: if (rec[i][j] == 0)
38: { 39: res.win = i; 40: res.los = j; 41: flag = 0; 42: } 43: } 44: } 45: flag = 1;46: for (int i = 1; i <= n && flag; i++)
47: {48: if (rec[res.win][i] == 1 && rec[i][res.los] == 1)
49: {50: printf("%d %d\n", res.win, res.los);
51: flag = 0; 52: } 53: }54: if (flag)
55: printf("%d %d\n", res.los, res.win);
56: }57: return 0;
58: }
浙公网安备 33010602011771号