CodeForces 1569B Chess Tournament

题目链接:CodeForces 1569B Chess Tournament

题目大意:
(n)个人参加下棋比赛,每两个人之间进行一场比赛,比赛结果分为输、赢、平局。
这些人分为两种,一种不想输任何一场比赛,另一种想至少赢一场比赛。
给定人数和每个人的类型,求一种可行的比赛结果。

题解:
可将两种人分开看:

  1. 第一种人不想输任何一场比赛,所以可以让他们和其他所有人的比赛结果均为平局;
  2. 第二种人想至少赢一场比赛,则可以将他们排成一列,每个人只赢了下一个人,与其他人的结果均为平局,这一列的最后一个人则赢了最开始的那个人。

可见如果第二种人的个数为一个或者两个,则无法实现上述结果。

#include <iostream>
#include <string>
#include <vector>
using namespace std;
 
int t, n;
string s;
string ans[50];
 
int main() {
    cin >> t;
    while (t--) {
        cin >> n >> s;
        vector<int> id;
        for (int i = 0; i < n; ++i) {
            ans[i] = string(n, '=');
            ans[i][i] = 'X';
            if (s[i] == '2') id.push_back(i);
        }
        if (id.size() == 1 || id.size() == 2) {
            cout << "NO" << endl;
            continue;
        }
        cout << "YES" << endl;
        for (int i = 0; i < id.size(); i++) {
            int u = id[i], v = id[(i + 1) % id.size()];
            ans[u][v] = '+';
            ans[v][u] = '-';
        }
        for (int i = 0; i < n; ++i) cout << ans[i] << endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/IzumiSagiri/p/15249489.html