IndiaHacks 2nd Elimination 2017- A. Binary Blocks

题意:

对于给出的矩阵,选择一个整数k,为了使每个k*k正方形里的数字全为1或者全为0,你需要变换某些不一样的数字,求变换的最少次数。当n或者m不能整除k时,可以延长到整除为止,延长部分数字为0;注意是最少次数,所以要找到最合适的k。

思路:

 先打表,算出每个位置所包含的数字1的数目,之后在计算每个方块的数字时,只需要用相减的方法就可以算出来,不用再遍历。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char ma[5005][5005];
int biao[5005][5005];
int n,m,k,co,mi=100000000;
void yu(){
	for(int i=1;i<=5000;i++)
		for(int j=1;j<=5000;j++)
			if(ma[i][j]=='1') biao[i][j]=biao[i][j-1]+1;
			else biao[i][j]=biao[i][j-1];
	for(int j=1;j<=5000;j++)
		for(int i=1;i<5000;i++)
			biao[i][j]=biao[i][j]+biao[i-1][j];
}


int sea(int dx,int dy){
	for(int k=2;k<=max(dx,dy);k++){
		co = 0;
		for(int i=k;i-k< dx;i+=k)
			for(int j=k;j-k<dy;j+=k){
				int temp=biao[i][j]-biao[i-k][j]-biao[i][j-k]+biao[i-k][j-k];	
				co+=min(temp,k*k-temp);
			}
		if (co<mi) 		
		mi=co;
		return mi;			
}
int main(){
	scanf("%d %d",&n,&m);
	memset(biao,0,sizeof(biao));
	memset(ma,0,sizeof(ma));
	for(int i=1;i<=n;i++)
	 	scanf("%s",ma[i]+1);
	 yu();
	printf("%d\n",sea(n,m));
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Blaze Jack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值