Educational Codeforces Round 113 (Rated for Div. 2)

多拿纸画画 ! ! !

Problem - B - Codeforces

 

题意

给出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;// 不输   赢一次
}

 

posted @ 2021-09-09 21:14  la-la-wanf  阅读(28)  评论(0编辑  收藏  举报