D. Grid-00100(构造啊啊啊啊啊啊啊啊啊啊啊啊啊啊)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D. Grid-00100(构造啊啊啊啊啊啊啊啊啊啊啊啊啊啊)相关的知识,希望对你有一定的参考价值。
答 案 计 算 是 ( 最 大 行 和 − 最 小 行 和 ) 2 + ( 最 大 列 和 − 最 小 列 和 ) 2 答案计算是(最大行和-最小行和)^2+(最大列和-最小列和)^2 答案计算是(最大行和−最小行和)2+(最大列和−最小列和)2
说实话,看到这个答案计算方式我头都是痛的,完全看不出什么
不如,先考虑答案为0的时候
也 就 是 说 每 一 行 的 1 都 相 等 , 每 一 列 的 1 都 相 等 也就是说每一行的1都相等,每一列的1都相等 也就是说每一行的1都相等,每一列的1都相等
![](https://image.cha138.com/20220827/e9ab2c985f324129b540179487f929ff.jpg)
你 看 看 这 种 构 造 方 式 如 何 ? 每 行 每 列 都 是 3 个 1 你看看这种构造方式如何?每行每列都是3个1 你看看这种构造方式如何?每行每列都是3个1
第 i 行 从 第 i 个 开 始 放 置 连 续 的 k / n 个 1 第i行从第i个开始放置连续的k/n个1 第i行从第i个开始放置连续的k/n个1
很 明 显 , 这 样 构 造 要 满 足 一 个 条 件 , k 能 整 除 n 才 行 很明显,这样构造要满足一个条件,k能整除n才行 很明显,这样构造要满足一个条件,k能整除n才行
k不能整除n时怎么办?
此 时 不 论 如 何 都 不 能 使 每 行 1 个 数 相 等 , 也 不 能 使 每 列 相 等 \\colorRed此时不论如何都不能使每行1个数相等,也不能使每列相等 此时不论如何都不能使每行1个数相等,也不能使每列相等
因 为 假 设 行 ( 列 ) 间 相 等 , 设 每 行 ( 列 ) 有 s 个 1 , 那 么 s n = k \\colorRed因为假设行(列)间相等,设每行(列)有s个1,那么sn=k 因为假设行(列)间相等,设每行(列)有s个1,那么sn=k
然 而 k 是 不 整 除 n 的 , 所 以 行 和 列 都 会 至 少 相 差 1 个 \\colorRed然而k是不整除n的,所以行和列都会至少相差1个 然而k是不整除n的,所以行和列都会至少相差1个
那 么 答 案 最 优 是 1 2 + 1 2 = 2 , 幸 运 的 是 我 们 仍 然 很 容 易 构 造 出 来 那么答案最优是1^2+1^2=2,幸运的是我们仍然很容易构造出来 那么答案最优是12+12=2,幸运的是我们仍然很容易构造出来
这 时 候 怎 么 构 造 ? 设 k % n = y u 这时候怎么构造?设k\\%n=yu 这时候怎么构造?设k%n=yu
构 造 方 式 和 前 面 一 样 , 只 不 过 前 y u 行 多 放 置 1 个 1 构造方式和前面一样,只不过前yu行多放置1个1 构造方式和前面一样,只不过前yu行多放置1个1
这 样 可 以 保 证 行 最 多 和 行 最 少 只 相 差 1 个 1 , 列 同 理 这样可以保证行最多和行最少只相差1个1,列同理 这样可以保证行最多和行最少只相差1个1,列同理
#include <bits/stdc++.h>
using namespace std;
const int maxn=302;
int n,k,t,a[maxn][maxn];
int main()
cin >> t;
while(t--)
cin >> n >> k;
int yu=k%n,s=k/n;
if(yu==0) cout<<0<<endl;
else cout<<2<<endl;
for(int i=0;i<yu;i++)//前yu行每行放s+1个
for(int j=i;j<=i+s;j++)
a[i][j%n]=1;
for(int i=yu;i<n;i++)//后面的行每行放s个
for(int j=i;j<i+s;j++)
a[i][j%n]=1;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++) cout<<a[i][j];
cout<<endl;
memset(a,0,sizeof(a));
以上是关于D. Grid-00100(构造啊啊啊啊啊啊啊啊啊啊啊啊啊啊)的主要内容,如果未能解决你的问题,请参考以下文章