专栏文章

题解:P14133 【MX-X22-T4】「TPOI-4D」Another Matrix Problem

P14133题解参与者 4已保存评论 5

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
5 条
当前快照
1 份
快照标识符
@minonuxh
此快照首次捕获于
2025/12/02 05:50
3 个月前
此快照最后确认于
2025/12/02 05:50
3 个月前
查看原文
个人觉得抽象难懂通俗易懂。

思路

  • 对于第一行差值的输出,我们不难想到,从一加到偶数为止时它的和肯定为偶,此时可以把这些数分成相等两份,每份的和为总和除以二。而加到奇数为止时它们的和肯定为奇,除以二则会余一,也就代表两份的差为一。这时候,我们注意到,只要 nn 为偶就输出 00,否则输出 11
  • 接下来我们考虑如何构造。偶数的构造十分简单,从第一行开始每个数依次递增,对于它的正确性我们可以思考一下,由于黑白格是依次交错的,所以在奇数行黑白格的差会在偶数行补回来。奇数的话我们只需要在第一列从 22 摆到 n1n-1,在放一个 11,接下来后面几列按偶数的方法摆。这样又为什么是正确的呢,首先呢除去第一列和最后一行,剩下的就和 nn 为偶数时的抵消方式一模一样,而第一列和最后一行刚刚好黑白格可以一一对应,而左下角的那个 11 就是它们最后的差值。

代码

CPP
#include <bits/stdc++.h>
using namespace std;
int n, k, a[2010][2010];
int main()
{
    scanf("%d", &n);
    if (n % 2)
    {
        a[n][1] = ++k;
        for (int i = 1; i < n; i++)
            a[i][1] = ++k;
        for (int i = 1; i <= n; i++)
            for (int j = 2; j <= n; j++)
                a[i][j] = ++k;
    }
    else
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++)
                a[i][j] = ++k;
    printf("%d\n", n % 2);
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
            printf("%d ", a[i][j]);
        printf("\n");
    }
    return 0;
}
题解来之不易,且看且珍惜。
给个赞再走吧。

评论

5 条评论,欢迎与作者交流。

正在加载评论...