专栏文章
题解: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 个月前
个人觉得抽象难懂通俗易懂。
思路
- 对于第一行差值的输出,我们不难想到,从一加到偶数为止时它的和肯定为偶,此时可以把这些数分成相等两份,每份的和为总和除以二。而加到奇数为止时它们的和肯定为奇,除以二则会余一,也就代表两份的差为一。这时候,我们注意到,只要 为偶就输出 ,否则输出 。
- 接下来我们考虑如何构造。偶数的构造十分简单,从第一行开始每个数依次递增,对于它的正确性我们可以思考一下,由于黑白格是依次交错的,所以在奇数行黑白格的差会在偶数行补回来。奇数的话我们只需要在第一列从 摆到 ,在放一个 ,接下来后面几列按偶数的方法摆。这样又为什么是正确的呢,首先呢除去第一列和最后一行,剩下的就和 为偶数时的抵消方式一模一样,而第一列和最后一行刚刚好黑白格可以一一对应,而左下角的那个 就是它们最后的差值。
代码
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 条评论,欢迎与作者交流。
正在加载评论...