P7873 「SWTR-07」Scores

1 P7873 「SWTR-07」Scores

2 题目描述

时间限制 \(200ms\) | 空间限制 \(16MB\)

试构造一个 \(n \times m\) 的矩阵 \(s\),满足所有元素为 \([0,100]\) 之间的整数,且对于任意 \(i,j\ (i\neq j)\) 存在一个 \(k\) 使得 \(s_{i,k}>s_{j,k}\)

数据范围:

对于 \(100\%\) 的数据,\(1\leq n,m\leq 100,T=20\)

3 题解

考虑构造。

容易发现,对于任意 \(i \ne j\),一定 \(\exists \space k_1, s_{i, k_1} > s_{j, k_1}\)\(\exists \space k_2, s_{i, k_2} < s_{j, k_2}\)

为了尽可能满足条件,我们令 \(k_1 = 1, k_2 = 2\)

此时将每行的第一列按照 \(1,2,..,n\) 构造,第二列按照 \(n, n-1, ..., 1\) 构造即可。

注意判断无解情况。

4 代码(空格警告):

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
#include <cstdlib>
#include <cmath>
using namespace std;
const int N = 105;
int read()
{
    int x = 0, f = 1;
    char c = getchar();
    while (c < '0' || c > '9')
    {
        if (c == '-') f = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9')
    {
        x = (x << 1) + (x << 3) + (c ^ 48);
        c = getchar();
    }
    return x * f;
}
int T;
int n, m;
int Map[N][N];
int main()
{
    T = read(), T = read();
    while (T--)
    {
        n = read(), m = read();
        if (n != 1 && m == 1)
        {
            puts("NO");
            continue;
        }
        puts("YES");
        if (n == 1 && m == 1) 
        {
            puts("0");
            continue;
        }
        for (int i = 1; i <= n; i++)
        {
            Map[i][1] = i;
            Map[i][2] = n - i + 1;
        }
        for (int i = 1; i <= n; i++)
            for (int j = 3; j <= m; j++)
                Map[i][j] = 0;
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= m; j++) printf("%d ", Map[i][j]);
            puts("");
        }
    }
    return 0;
}

欢迎关注

posted @ 2021-09-22 22:51  David24  阅读(64)  评论(0编辑  收藏  举报