【蓝桥·算法双周赛 第 9 场 小白入门赛】盖印章【算法赛】题解(数学+解方程)

思路

考虑到题目中的规则,每个印章图案的边必须和网格图边重合,网格图上的每一个格子最多只能被一个印章图案覆盖,印章的图案在网格图上必须是完整的。这意味着每个印章图案都会覆盖一个独立的、完整的区域,且这些区域不会相互重叠。

设第一种印章覆盖的格子数为 x x x,第二种印章覆盖的格子数为 y y y,那么它们的总覆盖格子数为 c n t = x + y cnt = x + y cnt=x+y。同时,题目给出两种印章的使用次数之和为 k k k。由于每种印章的使用次数必须是整数,我们可以设第一种印章的使用次数为 a a a,第二种印章的使用次数为 b b b,那么 a + b = k a + b = k a+b=k。又有 3 a + 2 b = c n t 3a + 2b = cnt 3a+2b=cnt。

这两个方程构成一个线性方程组,可以使用消元法求解。先将第二个方程乘以2得到 2 a + 2 b = 2 k 2a + 2b = 2k 2a+2b=2k,然后将第一个方程减去这个得到 a = c n t − 2 k a = cnt - 2k a=cnt−2k。这就是印章A的使用次数。

接着,将求得的印章A的使用次数 a a a 代入第二个方程 a + b = k a + b = k a+b=k,可以解得 b = k − a = 3 k − c n t b = k - a = 3k - cnt b=k−a=3k−cnt。这就是印章B的使用次数。

首先从输入中读取三个整数 nmk,这三个整数分别表示网格图的行数、列数和两种印章的使用次数之和。然后,通过一个循环,读取 n × m n \times m n×m 个字符,每个字符表示一个网格图上的格子,字符 '1' 表示这个位置被印章图案覆盖,字符 '0' 表示这个位置没有被覆盖。在读取每个字符的同时,如果字符为 '1',则将计数器 cnt 加一,这样 cnt 就表示了印章覆盖的格子总数。

在读取完所有字符之后,输出两种印章的使用次数。第一种印章的使用次数为 (cnt - 2 * k),第二种印章的使用次数为 (3 * k - cnt)。这样就得到了每种印章的使用次数。


AC代码

cpp 复制代码
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
#define AUTHOR "HEX9CF"
using namespace std;
using ll = long long;

const int N = 1e6 + 7;
const int INF = 0x3f3f3f3f;

ll n, m, k;
ll cnt = 0;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	cin >> n >> m >> k;
	for (int i = 1; i <= n * m; i++) {
		char t;
		cin >> t;
		cnt += (t == '1');
	}
	cout << (cnt - 2 * k) << " " << (3 * k - cnt) << "\n";
	return 0;
}

相关推荐
澈2071 分钟前
图论基础:邻接矩阵与邻接表详解
算法·图论·邻接矩阵
白日做梦Q6 分钟前
Miniconda 新手保姆级教程:从安装到熟练使用(全程无跳步,避坑指南附全)
人工智能·深度学习·算法·机器学习
吃好睡好便好7 分钟前
在Matlab中绘制变半径柱面图
开发语言·人工智能·学习·算法·matlab
拂拉氏10 分钟前
【知识讲解-题目讲解】:二叉树的前、中、后序遍历的三种实现(递归,非递归,Morris遍历)与二叉树oj题讲解(二叉树最近公共祖先,二叉树展开为链表)
数据结构·算法·leetcode·二叉树·遍历
luck_bor11 分钟前
File 类核心笔记
java·前端·算法
cen__y13 分钟前
Linux知识点复习总结(2)
linux·运维·服务器·c语言·开发语言
anew___24 分钟前
从高方差到稳定训练:深度强化学习算法演进全解析
算法
大大杰哥34 分钟前
2026陕西省ICPC省赛补题(前六题)
c++·算法
Brilliantwxx36 分钟前
【C++】 继承与多态(上)
开发语言·c++·笔记·算法
05候补工程师37 分钟前
【线性代数】核心考点:二次型、矩阵三大关系综合与正定矩阵判别法
笔记·线性代数·考研·算法·矩阵