题目来源: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代码:
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <string>
#include <vector>
9:
namespace std;
11:
struct R
13: {
int win, los;
15: };
16:
int main()
18: {
int n, win, los;
int rec[59][59];
, &n))
22: {
sizeof(rec));
int i = 1; i < (n*(n-1)/2); i++)
25: {
, &win, &los);
27: rec[win][los] = 1;
28: rec[los][win] = -1;
29: }
30: R res;
bool flag = 1;
int i = 1; i <= n && flag; i++)
33: {
int j = 1; j <= n && flag; j++)
35: {
continue;
if (rec[i][j] == 0)
38: {
39: res.win = i;
40: res.los = j;
41: flag = 0;
42: }
43: }
44: }
45: flag = 1;
int i = 1; i <= n && flag; i++)
47: {
if (rec[res.win][i] == 1 && rec[i][res.los] == 1)
49: {
, res.win, res.los);
51: flag = 0;
52: }
53: }
if (flag)
, res.los, res.win);
56: }
return 0;
58: }