小红拿到了一个矩阵,初始有一些格子被染成了黑色。现在小红希望把最多 k 个未被染成黑色的格子染成红色,具体的计分方式是:如果一个红色格子下方相邻的格子也是红色,那么这个红色格子可以获得1分。 小红想知道,最多可以得到多少分?
第一行输入三个正整数 n,m,k ,代表矩阵的行数和列数、以及小红最多可以染色的格子数量。 接下来的 n 行,每行输入一个长度为 m 的字符串,用来表示矩阵的初始染色情况。'*'字符代表黑色,'o'字符代表白色。 1≤ n,m ≤ 1000 1≤ k ≤ n*m
一个整数,代表小红可以获得的最大分数。
4 4 3 *o*o oooo **** oooo
1
3 3 3 *o* *o* *o*
2
考点:排序 · 贪心
数据规模 n ≤ 1e3 | 限制 1 秒 / 256MB | 标准输入输出
推荐方向:排序
先用 O(n log n) 排序把无序变有序,后续处理往往就简单了。
思路框架(排序 通法 · 非本题专属)
实现要点:在 C++ 中用 std::sort,Python 用 sorted();注意自定义比较函数的严格弱序。
复杂度:时间 O(n log n) | 空间 O(log n) ~ O(n)
该范式的通法易错点
对照本题
样例 1:输入 4 4 3 / *o*o / oooo / **** / oooo → 输出 1
将矩阵染色成如下样式即可('r'代表红色):
*r*o
oroo
****
oooo
解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。
本题来源:2023年秋招-京东-技术通用岗位-第八批笔试。