题意:给你个n*m的矩阵,要求你找到一个k,k > 1,使得矩阵可以分为很多k * k的小正方形,然后进行操作把每个小正方形都变为0或1,问你怎样使操作数最小。

思路:随便暴力不可取,显然你每次遍历查找k * k正方形里1和0的数量会超时。这里新学了一招前缀和,其实和二位树状数组差不多。就是预处理前缀和,以达到花O(1)的时间算出(1,1)~(x,y)的和,这样我们就能直接暴力枚举每一种k的操作数,然后取最小即为答案。

参考:前缀和与差分

代码:

#include<stack>
#include<vector>
#include<queue>
#include<set>
#include<cstring>
#include<string>
#include<sstream>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define ll long long
#define ull unsigned long long
using namespace std;
const int maxn = +;
const int seed = ;
const int MOD = ;
const int INF = 0x3f3f3f3f;
int sum[maxn][maxn];
char s[maxn];
int get(int x1,int y1,int x2,int y2){
return sum[x2][y2] - sum[x2][y1 - ] - sum[x1 - ][y2] + sum[x1 - ][y1 - ];
}
int main(){
int n,m,k,end;
scanf("%d%d",&n,&m);
end = max(n,m);
memset(sum,,sizeof(sum));
for(int i = ; i <= n; i++){
scanf("%s",s + );
for(int j = ; j <= m; j++){
sum[i][j] = s[j] - '';
}
}
for(int i = ;i < maxn;i++){ //前缀和
for(int j = ;j < maxn;j++){
sum[i][j] += sum[i][j - ] + sum[i - ][j] - sum[i - ][j - ];
}
}
int ans = INF;
for(int k = ; k <= end; k++){
int cnt = ,endL,endR;
if(n % k == ) endL = n;
else endL = (n / k + ) * k;
if(m % k == ) endR = m;
else endR = (m / k + ) * k; for(int i = ; i <= endL; i += k){
for(int j = ; j <= endR; j += k){
int have = get(i,j,i + k - ,j + k - );
cnt += min(have,k * k - have);
}
}
ans = min(ans,cnt);
}
printf("%d\n",ans);
return ;
}

最新文章

  1. Node.js大众点评爬虫
  2. LINUX下YUM源配置
  3. Jquery-选择框点击勾选或者取消
  4. 2.6---找有环链表的开头结点(CC150)
  5. HDU 5902 GCD is Funny 数学
  6. LightSpeed 之Sql和存储过程的使用
  7. 理解java中的ThreadLocal(转)
  8. 【转】浏览器DNS 预取读技术的危害
  9. php ddos 安全处理代码
  10. 阿里云Prismplayer-Web播放器的使用
  11. 解决cors跨域的filter
  12. C#-封装(七)
  13. 利用Swoole编写一个TCP服务器,顺带测试下Swoole的4层生命周期
  14. Ext.ux.grid.feature.Searching 解析查询参数,动态产生linq lambda表达式
  15. jQuery瀑布流无限拖三大利器:masonry+imagesloaded+infinitescroll
  16. Linux时间同步+国内常用的NTP服务器地址
  17. 【luogu P4180 严格次小生成树[BJWC2010]】 模板
  18. cocosbuilder的一些坑
  19. 宁波Uber优步司机奖励政策(1月11日~1月17日)
  20. [Tips] Resolve error: server certificate verification failed.

热门文章

  1. Linux命令行常用光标移动快捷键
  2. salt更换新key
  3. 去面试H5游戏问的一些问题
  4. 【BZOJ3280】小R的烦恼 最小费用最大流
  5. Service简介 demos
  6. Linux定时对日志批量打包Shell脚本及定时任务crontab 详细用法
  7. 170519、FastDFS分布式文件系统的安装与使用(单节点)
  8. 160227、javascript特效
  9. 用MongoDB取代RabbitMQ(转)
  10. Python性能鸡汤(转)