loj#6030 「雅礼集训 2017 Day1」矩阵 贪心

38 篇文章 0 订阅
33 篇文章 0 订阅

Description


给一个n*n的01矩阵,每次可以用一行替换一列。问最少多少次操作使得整个矩阵全1
n<=1000

Solution


先考虑怎么把一整行刷成1。我们枚举全1的行设为x,若存在第x列为1的行则可以填上第x行的0,否则我们可以多操作一次任意选一个存在1的行使得某行的第x列为1,然后照做就行了

Code


#include <stdio.h>
#include <string.h>
#include <algorithm>

#define rep(i,st,ed) for (int i=st;i<=ed;++i)

const int N=2005;

char s[N][N],t[N][N];

int c[N];

int main(void) {
	int n; scanf("%d",&n);
	bool flag=false;
	rep(i,1,n) {
		scanf("%s",s[i]+1);
		rep(j,1,n) {
			if (s[i][j]=='#') c[j]++,flag=true;
		}
	}
	int tot=n;
	rep(i,1,n) if (c[i]==n) tot--;
	int ans=0x3f3f3f3f;
	rep(i,1,n) {
		int cnt=0;
		rep(j,1,n) if (s[i][j]=='.') cnt++;
		ans=std:: min(ans,cnt+tot+(!c[i]?flag:0));
	}
	if (!flag) ans=-1;
	printf("%d\n", ans);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值