CodeForces 803A Maximal Binary Matrix

枚举。

枚举对角线上放多少个$1$,剩余的贪心放,更新答案。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <algorithm>
using namespace std;

int n,k;
int a[110][110];
int b[110][110];

void ok()
{
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(a[i][j]!=b[i][j])
			{
				if(a[i][j]>b[i][j]) 
				{
					for(int ii=1;ii<=n;ii++)
					{
						for(int jj=1;jj<=n;jj++)
						{
							b[ii][jj] = a[ii][jj];
						}
					}
				
				}
				return ;
			}
		}
	}
}

int main()
{
	scanf("%d%d",&n,&k);
	if(n*n<k)
	{
		printf("-1
");
		return 0;
	}

	int suc = 0;

	for(int x=0;x<=n;x++)
	{
		memset(a,0,sizeof a);

		if(x>k) continue;
		if((k-x)%2!=0) continue;
		if( n*n - n < k-x ) continue;

		for(int i=1;i<=x;i++) a[i][i] = 1;

		int sum = 0;
		if((k-x)!=0)
		{
			for(int i=1;i<=n;i++)
			{
				for(int j=i+1;j<=n;j++)
				{
					a[i][j] = a[j][i]=1;
					sum+=2;
					if(sum == k-x) break;
				}
				if(sum == k-x) break;
			}
		}

		if(sum == k-x) suc=1;
		ok();
	}

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

	return 0;
}
原文地址:https://www.cnblogs.com/zufezzt/p/6836906.html