【题解】CF1720C
题意简述
给你一个 01 矩阵,每一次你可以在这个矩阵中找到一个 \(L\) 型,将它全部变成 0。\(L\) 型的定义是在一个 \(2\times2\) 矩阵中,除开一个角之外的图形,其中必须包含至少一个 1。
现在需要你找到将整个矩阵变成 1 的最大操作数。
题目分析
由于 L 型是在一个 2$\times$2 的矩阵中,所以我们不妨从这里开始分析。
1. 如果矩阵没有 0
1 1
1 1
这种情况会有 4 个 1。
显然,第一次操作至少会让三个 1 变成 0,然后转到情况 4,这时候最大操作数是 2。
此时,操作数 = 1 的个数 -2。
2. 如果矩阵只有一个 0
0 1
1 1
其中的一种情况是上面这样的,这时候会有 3 个 1。
同样的,第一次操作至少会让两个 1 变成 0,然后转到情况 4,这时候最大的操作数是 2。
此时,操作数 = 1 的个数 -1。
3. 如果矩阵只有两个 0
0 1 | 0 0
1 0 | 1 1
其中有两种情况如上图,这时候会有 2 个 1。
这时候第一次操作可以只改变一个 1,接着转到情况 4,最大的操作数是 2。
此时,操作数 = 1 的个数。
4. 如果矩阵只有三个 0
0 0
0 1
其中一种情况如上,这时候有 1 个 1.
这时候只能改变一个 1,操作数也就是 1。同时显然,矩阵中没有 1 是操作数是 0,这里便不做分类讨论。
此时,操作数 = 1 的个数。
根据上面的分析,我们可以大胆猜想,设 1 的个数为 x,0 的个数为 y,操作数为 ans,则在 2$\times$2 矩阵中:
\(\begin{cases}
ans &= x-2 &(y=0) \\
ans &= x-1 &(y=1) \\
ans &=x &(y\ge2)
\end{cases}\)
我们尝试将结论推广到普通矩阵中。
没有 0 的情况显然和之前一样。
而这时候就不是只有 1 个 0 的情况,而是在一个 2$\times$2 矩阵中只有 1 个 0。
同样,至少有 2 个 0 的情况也需要转移到在 2$\times$2 矩阵中至少有 2 个 0。
这样我们只要求出 1 的个数并且判断在 2$\times$2 矩阵中有没有至少两个 0 即可。
为什么这种思路是正确的?
一个任意的 n\(\times\)m 矩阵(\(n,m\ge2\)),都会包含若干个 2$\times$2 的矩阵,即使矩阵可能会重叠。
如果其中有一个矩阵有大于 1 个的 0,就可以从这里开始操作,扩展到每个 2$\times$2 矩阵都有大于 1 个的 0,情况简化成最开始分析中的第三种情况。否则就只能按照第二种情况来扩展。
#include<bits/stdc++.h>
using namespace std;
const int N=5e2+5;
int n,m;
int a[N][N];
signed main(){
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--){
cin>>n>>m;
int suma=0,sumb=0;//suma是0的个数,sumb是1的个数。其实只记录其中的一个也可以
bool f=false;
for(int i=1;i<=n;i++){
string s;
cin>>s;
for(int j=0;j<m;j++) a[i][j+1]=s[j]-'0';
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]==0){
suma++;
//下面判断2*2矩阵中有两个0的情况,注意判断数组越界,用循环也可以
if((i+1<=n&&a[i+1][j]==0)||(i-1>=1&&a[i-1][j]==0)||(j-1>=1&&a[i][j-1]==0)||(j+1<=m&&a[i][j+1]==0)) f=true;//两个0是相邻的
else if((i+1<=n&&j+1<=m&&a[i+1][j+1]==0)||(i-1>=1&&j-1>=1&&a[i-1][j-1]==0)||(i+1<=n&&j-1>=1&&a[i+1][j-1]==0)||(i-1>=1&&j+1<=m&&a[i-1][j+1]==0)) f=true;//两个0称对角
}
else sumb++;
}
}
if(suma==0) cout<<sumb-2<<"\n";//都是1
else if(sumb==0) cout<<"0\n";//都是0
else if(f==false) cout<<sumb-1<<"\n";//所有2*2矩阵中都只有一个0
else cout<<sumb<<"\n";//任意2*2矩阵中有至少两个0
}
return 0;
}
【题解】CF1720C的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- Java学习 (五)基础篇 数据类型
目录 数据类型 强类型语言 弱类型语言 Java数据类型分为两大类 八大字节类型(重点) Java数据类型拓展 整数拓展:进制 浮点数拓展 字符类型 布尔值拓展 数据类型 强类型语言 要求变量的使用要 ...
- Rider调试ASP.NET Core时报thread not gc-safe的解决方法
新建了一个ASP.NET Core 5.0的Web API项目,当使用断点调试Host.CreateDefaultBuilder(args)时,进入该函数后查看中间变量的值,报错Evaluatio ...
- 微服务性能分析|Pyroscope 在 Rainbond 上的实践分享
随着微服务体系在生产环境落地,也会伴随着一些问题出现,比如流量过大造成某个微服务应用程序的性能瓶颈.CPU利用率高.或内存泄漏等问题.要找到问题的根本原因,我们通常都会通过日志.进程再结合代码去判断根 ...
- SpringBoot项目搭建 + Jwt登录
临时接了一个小项目,有需要搭一个小项目,简单记录一下项目搭建过程以及整合登录功能. 1.首先拿到的是一个码云地址,里面是一个空的文件夹,只有一个 2. 拿到HTTPS码云项目地址链接,在IDEA中cl ...
- UE 实现镜头平移,旋转和缩放
0x00 引 在数字孪生三维场景中,通过键盘和鼠标来控制镜头的移动,缩放是很常见的行为,也是很必要的行为,用户正是通过这些操作,达到对整个三维场景的观看和控制. 0x01 键盘控制镜头前后左右移动 通 ...
- Linux 更换国内源
1.事件背景 事情起因是因为我想安装xvfb,执行sudo apt-get install xvfb发现安装报错,看报错原因是被墙导致,因为我用的默认源也没有挂代理:然后就百度,发现都是互相抄,什么换 ...
- 开源:Taurus.MVC-Java 版本框架 (支持javax.servlet.*和jakarta.servlet.*双系列,内集成微服务客户端)
版本说明: 因为之前有了Taurus.MVC-DotNet 版本框架,因此框架标了-Java后缀. .Net 版本: 开源文章:开源:Taurus.MVC-DotNet 版本框架 (支持.NET C ...
- KingbaseES V8R6 集群环境wal日志清理
案例说明: 1.对于集群中的wal日志,除了需要在备库执行recovery外,在集群主备切换(switchover或failover)时,sys_rewind都要读取wal日志,将数据库恢复到一致性状 ...
- 全能成熟稳定开源分布式存储Ceph破冰之旅-上
@ 目录 概述 定义 传统存储方式及问题 优势 生产遇到问题 架构 总体架构 组成部分 CRUSH算法 数据读写过程 CLUSTER MAP 部署 部署建议 部署版本 部署方式 Cephadm部署 前 ...
- ClangFormat配置备份
{ # 语言 Language: Cpp, # 水平对齐表达式的操作数 AlignOperands: true, # 不对包含头文件进行排序 SortIncludes: false, # 对齐注释 A ...