Educational Codeforces Round 113 (Rated for Div. 2) 题意 题解 AC代码
多拿纸画画 ! ! !
给出n个数字(数字为1或2), 1代表这第i个选手没有输过, 2代表这第i个选手至少赢一次
输出为n*n矩阵( i行j列) , +表示 i 赢了j, -表示 i 对j输了, =表示ij平局, X表示i=j
题解
1表示这个选手没输过, 那就全是=或+, 但是我们还要尽量保证别的是1的选手没输过, 即:
是1的选手统统默认是=
其实1有多少没什么关系, 如图,
对于2, 像这种, 可以让3vs4 4vs5 5vs3, 前者赢. 如3赢了2, (3,2)为+, (2,3)为- , 一对
占两格而对于样例22这种, 只有2个空格, 至少有1个2没有赢过, 对于样例2这种, 只有0个
空格更离谱了, 直接输出NO
AC代码
#include <string> #include <iostream>// 不输 赢一次 #include <vector> using namespace std; string a, s[60]; bool book[60][60]; int main() { int t; cin >> t; bool flag = 1,f; while(t --) { vector<int> id; int n; cin >> n >> a; for(int i = 0; i < n; i ++) { s[i] = string(n, '='); s[i][i] = 'X'; if(a[i] == '2') id.push_back(i); } if(id.size() <= 2 && id.size() > 0) { puts("NO"); continue; } for(int i = 0; i < id.size(); i ++) { if(i+1 == id.size()) s[id[i]][id[0]] = '+', s[id[0]][id[i]] = '-'; else s[id[i]][id[i+1]] = '+', s[id[i+1]][id[i]] = '-'; } puts("YES"); for(int i = 0; i < n;i ++) cout << s[i] << endl; } return 0;// 不输 赢一次 }