Educational Codeforces Round 20 A - Maximal Binary Matrix

1.题目链接

http://codeforces.com/contest/803/problem/A

2.题目描述

A. Maximal Binary Matrix
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

You are given matrix with n rows and n columns filled with zeroes. You should put k ones in it in such a way that the resulting matrix is symmetrical with respect to the main diagonal (the diagonal that goes from the top left to the bottom right corner) and is lexicographically maximal.

One matrix is lexicographically greater than the other if the first different number in the first different row from the top in the first matrix is greater than the corresponding number in the second one.

If there exists no such matrix then output -1.

Input

The first line consists of two numbers n and k (1 ≤ n ≤ 1000 ≤ k ≤ 106).

Output

If the answer exists then output resulting matrix. Otherwise output -1.

Examples
input
Copy
2 1
output
Copy
1 0 
0 0 
input
Copy
3 2
output
Copy
1 0 0 
0 1 0 
0 0 0 
input
Copy
2 5
output
Copy
-1

3.题意解释

题目的输入包含两个整数n和k,n代表的是一个矩阵的行数与列数,即一个n*n的矩阵,且该矩阵的所有元素的初始值都为0;我们要把这个矩阵中的k个元素的值改为1,使得最后得到的矩阵是一个沿主对角线对称的矩阵。另一个要求是,这个矩阵必须是所有沿主对角线对称的矩阵中字典序最大的那一个。

怎么判断矩阵A的字典序比矩阵B的字典序大呢?比较它们第一个不相同的行中第一个不相同的元素,如果A的这个元素比B的大,那么A的字典序就比B的大。

如果可以得到符合上述要求的矩阵,则输出这个矩阵;如果无法得到,就输出-1。

4.思路

首先看一下n和k的范围,n最大为100,k最大为1e6,很自然的想到如果k的值比n*n还要大的话,肯定得不到解。

题目要求字典序最大,那也就是说行数靠前的元素如果可以被置为1,就一定要把这个元素置为1,否则它就不可能是字典序最大的。因此可以从矩阵的第一个元素到最后一个元素进行遍历,如果元素可以被置为1,就将其置为1。每个元素分为两种情况,如果该元素不是主对角线上的元素,为了保证矩阵是对称阵,除了把该元素置为1之外,还需要把该元素关于主对角线对称的那个元素也置为1,同时把k的值减去2;如果该元素不是主对角线上的元素,则只需要把该元素置为1,并使k的值减去1。每次访问到一个矩阵元素时,可以判断一下k是否已经为0,k变成0表示所有的1已经被放到该放的位置了,没有1可放了,此时需要结束循环。

5.代码

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>

using namespace std;

const int maxn = 105;

int mat[maxn][maxn];

int main()
{
	memset(mat, 0, sizeof(mat));

	int n, k;
	while (scanf("%d%d", &n, &k) == 2)
	{
		if (k > n * n)
			printf("-1\n");
		else
		{
			for (int i = 0; i < n; ++i)
			{
				if (k == 0)  //所有的1已经放完了,结束循环
					break;
				for (int j = 0; j < n; ++j)
				{
					if (k == 0)  //所有的1已经放完了,结束循环
						break;
					if (i == j)  //主对角线上的元素
					{
						mat[i][j] = 1;
						--k;
					}
					else if (i < j)  //非主对角线上的元素
					{
						if (k == 1)
							continue;
						mat[i][j] = 1;
						mat[j][i] = 1;
						k -= 2;
					}
				}
			}

			for (int i = 0; i < n; ++i)
			{
				for (int j = 0; j < n; ++j)
				{
					printf("%d", mat[i][j]);
					if (j == n - 1)
						printf("\n");
					else
						printf(" ");
				}
			}
		}
	}

	return 0;
}

阅读更多
个人分类: 日常CF训练
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

Educational Codeforces Round 20 A - Maximal Binary Matrix

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭