Content

给定一个 \(5\times 5\) 的矩阵,请在这个矩阵中找出一个元素,使得这个元素既是它所在行的最大值,也是它所在列的最小值。

Solution

如果直接暴力枚举每一个元素,再去算每一个元素所在行的最大值和所在列的最小值,再比较,虽然也可以通过这道题目,但是太麻烦了。有没有更简单的方法?

答案是肯定的。

我们发现对于同一行的元素,每次计算所在行的最大值其实是重复 \(5\) 次了的,同样地,我们发现对于同一列的元素,每次计算所在列的最小值其实也是重复 \(5\) 次了的。有没有不重复的方法?预处理。我们在整个程序的核心部分开始之前,先预处理每一行和每一列,求出每一行的最大值和每一列的最小值。这样的复杂度如果是 \(n\times n\) 的矩阵的话是 \(\mathcal O(n^2)\) 的(即先枚举每一行或每一列,再枚举每一行或每一列的元素取最值)。然后我们就可以在执行程序的时候,直接拿预处理出来的最大值和最小值比较输出就好了。

预处理的优势在本题中尽管没有很大的体现,但是在今后的信息学习中,你将可以看到预处理发挥的巨大的优化复杂度的作用。

Code

#include <cstdio>
#include <algorithm> //因为要用到 max 和 min 函数
using namespace std; int fl = 0; //用来判断是否有鞍点
long long a[7][7], col[7], row[7]; int main() {
for(int i = 1; i <= 5; ++i) row[i] = -0x3f3f3f3f3f3f3f3f, col[i] = 0x3f3f3f3f3f3f3f3f; //C++ 中,0x开头的后面数是十六进制。
for(int i = 1; i <= 5; ++i) for(int j = 1; j <= 5; ++j) a[i][j] = Rll;
for(int i = 1; i <= 5; ++i) for(int j = 1; j <= 5; ++j) row[i] = max(row[i], a[i][j]);
for(int j = 1; j <= 5; ++j) for(int i = 1; i <= 5; ++i) col[j] = min(col[j], a[i][j]); //想想这里为什么要先循环 j 再循环 i。
for(int i = 1; i <= 5; ++i) for(int j = 1; j <= 5; ++j) if(a[i][j] == col[j] && a[i][j] == row[i]) {printf("%d %d %lld", i, j, a[i][j]), fl = 1; break;}
if(!fl) printf("not found");
return 0;
}

最新文章

  1. AngularJs之八
  2. 耿丹CS16-2班助教总结
  3. Socket网络编程一
  4. iOS 面试总结 一
  5. js正则表达式图形化工具-rline
  6. heart beat/心跳包
  7. 上传图片HTML &lt;form&gt; 标签的 method 属性
  8. npm配置代理
  9. ucenter 整合同步登录的内部实现原理及thinkphp整合ucenter
  10. JNI 系统钩子
  11. Java中创建对象的5种方式 &amp;&amp;new关键字和newInstance()方法的区别
  12. X-003 FriendlyARM tiny4412 uboot移植之添加相应目录文件
  13. 060、在docker中使用flannel(2019-03-29 周五)
  14. MSSQL Server 数据库备份还原常用SQL语句及注意
  15. CSDN博客文章的备份及导出电子书CHM
  16. Ajax技术剖析
  17. numpy库数组拼接np.concatenate的用法
  18. React Native 首次加载白屏优化
  19. P1171 售货员的难题
  20. linux -- Ubuntu 安装搜狗输入法

热门文章

  1. 列生成算法(求解Cutting Stock问题)
  2. 【JQuery】(1)JQuery基础
  3. Codeforces 1476G - Minimum Difference(带修莫队+根号平衡)
  4. Atcoder M-SOLUTIONS Programming Contest C - Best-of-(2n-1)(无穷级数求和+组合恒等式)
  5. R包MetaboAnalystR安装指南(Linux环境非root)
  6. CentOS6.9安装python3
  7. Oracle-distinct()用法、count(distinct( 字段A || 字段B))是什么意思?distinct多个字段
  8. 充分利用nginx的reload功能平滑的上架和更新业务
  9. PL\SQL和PL/SQL Developer 12安装与配置
  10. kubectl logs查看日志时出现failed to create fsnotify watcher: too many open files