大家一起做训练 第一场 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
", res.win, res.los);
  51:                 flag = 0;
  52:             }
  53:         }
  54:         if (flag)
  55:             printf("%d %d
", res.los, res.win);
  56:     }
  57:     return 0;
  58: }
原文地址:https://www.cnblogs.com/wuhenqs/p/3399932.html