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

你 看 看 这 种 构 造 方 式 如 何 ? 每 行 每 列 都 是 3 个 1 你看看这种构造方式如何?每行每列都是3个1 ?31

第 i 行 从 第 i 个 开 始 放 置 连 续 的 k / n 个 1 第i行从第i个开始放置连续的k/n个1 iik/n1

很 明 显 , 这 样 构 造 要 满 足 一 个 条 件 , k 能 整 除 n 才 行 很明显,这样构造要满足一个条件,k能整除n才行 ,,kn

k不能整除n时怎么办?

此 时 不 论 如 何 都 不 能 使 每 行 1 个 数 相 等 , 也 不 能 使 每 列 相 等 \\colorRed此时不论如何都不能使每行1个数相等,也不能使每列相等 使1,使

因 为 假 设 行 ( 列 ) 间 相 等 , 设 每 行 ( 列 ) 有 s 个 1 , 那 么 s n = k \\colorRed因为假设行(列)间相等,设每行(列)有s个1,那么sn=k (),()s1,sn=k

然 而 k 是 不 整 除 n 的 , 所 以 行 和 列 都 会 至 少 相 差 1 个 \\colorRed然而k是不整除n的,所以行和列都会至少相差1个 kn,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 ,yu11

这 样 可 以 保 证 行 最 多 和 行 最 少 只 相 差 1 个 1 , 列 同 理 这样可以保证行最多和行最少只相差1个1,列同理 11,

#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(构造啊啊啊啊啊啊啊啊啊啊啊啊啊啊)的主要内容,如果未能解决你的问题,请参考以下文章

bzoj2119

。。。

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

再见青春。

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

如何连接两个csv文件?