题目描述

Alice得到了一张由n×m个黑白像素点组成的图片,她想要压缩这张图片。压缩图片的过程如下:
1.首先,选择一个正整数k(k>1),将图片划分成若干个k×k的小块。如果n,m不能被k整除,用白色像素点在图片的右边或下面补全,使补全成n,m都能被k整除。
2.由于压缩时每个k×k的小块必须颜色一致(即全黑或者全白),所以需要先改变某些像素点的颜色,然后再进行压缩。

在Alice可以自由的选择任意一个大于1的正整数k作为小块的边长的情况下,请你告诉Alice,她至少需要改变多少个像素点的颜色。

输入

输入的第一行包含两个由空格隔开的正整数n,m(2≤n,m≤1000),表示图片的尺寸。
接下来n行,每行包含一个长度为m的”01”串,表示Alice得到的那张图片。”0”表示一个白色像素点,”1”表示一个黑色像素点。

输出

输出一个整数,表示Alice要压缩她的图片至少需要改变颜色的像素点的个数。

样例输入

3 5
00100
10110
11001

样例输出

5

提示

选择k=2,图片被补全为,如下:
001000
101100
110010
000000
为使每个2×2的小块颜色一致,改变颜色为,如下:
001100
001100
000000
000000
可以发现这是所有情况中改变颜色的像素点数最少的,改变了5个像素点的颜色(答案为5的改色方案不止这一种)。


题目大意:给出一个n*m的01矩阵,我们可以随意取一个k值,满足

  1. 整个n*m的矩阵可以分割为数个相邻的,大小为k*k的小矩阵,边界多余的部分若无法构成k*k,则用0补齐
  2. 要求每个k*k小矩阵中的数字相同:
    1. 全部为0
    2. 全部为1

问在上述两个约束条件下,我们最少需要改变多少个数字

题目分析:这个题目的题意还是比较容易理解的,现在就在于该如何实现了,因为前一天晚上在牛客做到了一个比较类似的二维前缀和的题目,所以读完这个题之后第一反应就是观察一下能否用二维前缀和辅助求解,答案肯定是可以的,所以我们就可以直接维护一个二维前缀和,然后从小到大枚举k,每次更新最终答案就可以了

对了需要注意一下,因为这个题目涉及到了边界补零的问题,所以我们的初始矩阵不能恰好开到1e3*1e3,肯定会RE的,因为我们枚举的k最大值是min(n,m),所以按理来说矩阵开到2e3*2e3,然后每次维护2*n*2*m的大小就足够用了

其实一开始用二维前缀和还是蛮担心会超时的,因为加上内层枚举的k,总的时间复杂度到了n*n*n,题目中的n是1e3,那么放到这个题目中就是1e9,肯定必超时,但有一个细节需要注意一下,因为随着k的增大,x和y枚举的次数就会和k成反比,也就是说当k达到一定大小的时候,x和y的枚举次数就会远远小于n,虽然这种情况下时间复杂度我也不太会算,但肯定无法到达1e9的程度,起码1e7或1e8评测机还是顶得住的

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=2e3+100;LL maze[N][N];int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)//读数据for(int j=1;j<=m;j++)scanf("%1lld",&maze[i][j]);for(int i=1;i<=n*2;i++)//维护二维前缀和for(int j=1;j<=m*2;j++)maze[i][j]+=maze[i-1][j]+maze[i][j-1]-maze[i-1][j-1];LL ans=inf;//初始化答案为无穷大for(int k=2;k<=min(m,n);k++)//枚举k{LL sum=0;//记录一下当前k的情况下的答案for(int i=k;i<=2*n;i+=k)for(int j=k;j<=2*m;j+=k){LL c=maze[i][j]-maze[i-k][j]-maze[i][j-k]+maze[i-k][j-k];sum+=min(llabs(c-1LL*k*k),c);//这里我们选取全部转换为当前1或者0中的较小值}ans=min(ans,sum);//实时更新答案}cout<<ans<<endl;return 0;
}

中石油训练赛 - Block(二维前缀和+思维)相关推荐

  1. 中石油训练赛 - 独居(二分水题)

    题目描述 一只奶牛自己独居,它每天需要吃1个水果和花费X元交暖气费.现在奶牛家里有F个水果和D元.奶牛最多能独居多少天?奶牛可以去超市买水果,超市每个水果P元. 输入 多组测试数据. 第一行,一个整数 ...

  2. 中石油训练赛 - 数学问题(思维)

    题目描述 我们高中曾经学过何为组合数. 那么,给出整数n,m,g,聪明的你能否求出有多少整数对(i,j),满足g整除吗?(其中0≤i≤n,0≤j≤min(i,m)). (提示:n!=1×2×⋯×n:特 ...

  3. 中石油训练赛 - Bouldering(最短路+剪枝)

    题目大意:给出一个 n * m 的矩阵,矩阵中有些许数字,两个数字之间的距离如果小于 r 的话就是可达,到达一个数字后会消耗数字对应的体力值,问从最下面的数字到最上面的数字的最短路是多少,必须要保证体 ...

  4. 中石油训练赛 - Racing Gems(最长不下降子序列)

    题目描述 You  are  playing  a  racing  game.  Your  character  starts  at  the  X-axis  line  (y=0)  and ...

  5. 中石油训练赛 - 斗地主(bfs)

    题目链接:点击查看 题目大意:给出斗地主的规则,以及最终分数,求出最少需要进行几局游戏 题目分析:bfs爆搜即可,因为数据范围比较小,我一开始没多想,直接18种情况全部打上去,交了一发T掉了..bfs ...

  6. 中石油训练赛 - 奎奎画画(思维+并查集+离线处理)

    题目描述 "为你写诗,为你静止,为你做不可能的事",爱情是一种怪事,它让奎奎开始学习画画.奎奎认为一张画的艺术价值等于画上的白色联通块个数(当一个格子和它上下左右四个方向上的某个相 ...

  7. 中石油训练赛 - Insertion Order(二叉搜索树+构造)

    题目大意:构造出一个长度为 n 的排列,使得按照这个顺序构造出的二叉搜索树的高度为 k 题目分析:知道 n 的大小后不难算出其可以构造的二叉搜索树高度的可行范围,下限是一棵满二叉树,这个利用倍增很快就 ...

  8. 中石油训练赛 - Cafebazaar’s Chess Tournament(FFT)

    题目大意:给出 n 个队伍,每个队伍有两个属性分别记为 a 和 b ,如果队伍 i 和队伍 j 比赛: a[ i ] > a[ j ] && b[ i ] > b[ j ] ...

  9. 中石油训练赛 - Gone Fishing(固定大小的圆可以覆盖最多的点)

    题目大意:在二维平面中给出 n 个点,再给出一个固定大小的圆,问如何放置这个圆可以使其覆盖最多的点 题目分析:首先不难想到一种 n^3 的做法,就是两层循环去枚举两个点,因为两个不同的点就可以确定下来 ...

最新文章

  1. Active MQ 双主 和 mysql双主 方案测试
  2. 2015-12-08 English
  3. 【Linux系统编程】进程间通信概述
  4. oracle的多线程怎么实现,创建线程的两个方法(Oracle官网说两种,所以我们就别说什么三种四种了)...
  5. @Transactional注解导致 多数据源@DS无效 的解决方案
  6. dedecms右侧悬浮_织梦dedecms网站上添加漂浮广告
  7. Spark 基础 —— RDD(创建 RDD)的两种方式
  8. Kaldi AMI数据集脚本学习1----cmd.sh和path.sh
  9. java容器取交集、并集、补集、差集示例
  10. android 组件重用,Android提高显示布局文件的性能,使用include标签重用layouts
  11. 学完这个PPT设计课程后,我实现了月入3w+!
  12. python之lxml.etree解析HTML
  13. VM 虚拟机 分辨率问题
  14. Python-while 计算100以内奇数和
  15. Git和Github的基本操作
  16. FRM-18108和FRM-10102解决方法
  17. Python包pretty_errors
  18. my eclipse 连接数据库(详细步骤)
  19. 速读区块链十年历史 2010年-2020年回顾
  20. 平常水题 - Atcoder 058 - C - 怪文書 / Dubious Document(字符串的处理)

热门文章

  1. 开启redis远程客户端连接
  2. MySQL高级 - 并发参数调整
  3. Nacos配置管理-Nacos实现配置管理
  4. 基于Xml 的IOC 容器-开始启动
  5. 生成服务器证书的申请文件和私钥文件
  6. 字符流读数据的2种方式
  7. Zookeeper的概述
  8. 数据库-查看表-创建表-查询表
  9. SpringBoot异常处理-@ExceptionHandler
  10. 获取商品列表(Feign)