题目链接:CodeForces 1569B Chess Tournament
题目大意:
有(n)个人参加下棋比赛,每两个人之间进行一场比赛,比赛结果分为输、赢、平局。
这些人分为两种,一种不想输任何一场比赛,另一种想至少赢一场比赛。
给定人数和每个人的类型,求一种可行的比赛结果。
题解:
可将两种人分开看:
- 第一种人不想输任何一场比赛,所以可以让他们和其他所有人的比赛结果均为平局;
- 第二种人想至少赢一场比赛,则可以将他们排成一列,每个人只赢了下一个人,与其他人的结果均为平局,这一列的最后一个人则赢了最开始的那个人。
可见如果第二种人的个数为一个或者两个,则无法实现上述结果。
#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;
}