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;
}

LuoguB2102 计算鞍点 题解的更多相关文章

  1. OpenJudge计算概论-计算鞍点

    /*======================================================================== 计算鞍点 总时间限制: 1000ms 内存限制: ...

  2. luoguP1313 计算系数 题解(NOIP2011)

    P1313 计算系数 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<cm ...

  3. p1313计算系数题解

    #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #i ...

  4. luogu1313计算系数题解--二项式定理

    题目链接 https://www.luogu.org/problemnew/show/P1313 分析 二项式定理 \((a+b)^n=\sum_{k=0}^{n}{C^k_n a^k b^{n-k} ...

  5. noi题库(noi.openjudge.cn) 1.8编程基础之多维数组T01——T10

    T01 矩阵交换行 描述 给定一个5*5的矩阵(数学上,一个r×c的矩阵是一个由r行c列元素排列成的矩形阵列),将第n行和第m行交换,输出交换后的结果. 输入 输入共6行,前5行为矩阵的每一行元素,元 ...

  6. OpenJudge解题经验交流

    1.1编程基础之输入输出01:Hello, World! 02:输出第二个整数PS:a,b需用longint类型接收 03:对齐输出 04:输出保留3位小数的浮点数 05:输出保留12位小数的浮点数 ...

  7. bzoj4198 荷马史诗 哈夫曼编码

    逐影子的人,自己就是影子. --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由<奥德赛>和&l ...

  8. [NOI 2015]荷马史诗

    Description 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由& ...

  9. 【算法】CRF(条件随机场)

    CRF(条件随机场) 基本概念 场是什么 场就是一个联合概率分布.比如有3个变量,y1,y2,y3, 取值范围是{0,1}.联合概率分布就是{P(y2=0|y1=0,y3=0), P(y3=0|y1= ...

随机推荐

  1. 【TcaplusDB知识库】如何部署TcaplusDB Local 版

    [TcaplusDB知识库]部署TcaplusDB Local 版的准备操作 1. 版本介绍 TcaplusDB Local版,是为用户提供的一个满足本地开发调试的版本(基于Docker部署的可下载版 ...

  2. 监听器watch

     <label > 姓名: <input type="text" placeholder="请输入姓名" v-model="firt ...

  3. pytest-rerunfailures/pytest-repeat重跑插件

    在测试中,我们会经常遇到这种情况,由于环境等一些原因,一条case运行5次,只有两次成功 其它三次失败,针对这种概率性成功或失败,若是我们每次都运行一次就比较耗时间,这个时候 就需要pytest提供的 ...

  4. SSM(Spring-MyBatis-SpringMVC)框架整合【完整版】

    整合SSM 01 基本配置文件的关系 web.xml配置DispatcherServlet 02 需要的maven依赖 <!--依赖 1.junit 2.数据库连接池 3.servlet 4.j ...

  5. Atcoder Typical DP Contest S - マス目(状压 dp+剪枝)

    洛谷题面传送门 介绍一个不太主流的.非常暴力的做法( 首先注意到 \(n\) 非常小,\(m\) 比较大,因此显然以列为阶段,对行的状态进行状压.因此我们可以非常自然地想到一个非常 trivial 的 ...

  6. DTOJ 4030: 排列计数

    [题目描述] 求有多少个1到n的排列满足恰有$k$对在排列中相邻的数满足前小于后,答案对2012取模. [输入] 一行2个正整数$n,k$. [输出] 输出一个整数表示答案. [样例输入] 5  2 ...

  7. 【Python小试】判断一条序列GC含量高低

    题目: 随便给定一条序列,如果GC含量超过65%,则认为高. 编程: from __future__ import division #整数除法 def is_gc_rich(dna): length ...

  8. 内存管理malloc 2

    malloc可以在函数指针内使用.#include <stdio.h> #include <stdlib.h> char * get_string() { //char s[] ...

  9. .Net调用Java的实现方法

    一. IKVM 1.1下载配置IKVM 1.1.1. 下载路径 http://www.ikvm.net/index.html 1.1.2. 设置路径 解压ikvm-0.42.0.3.zip,并将%IK ...

  10. 微信小程序扫描普通二维码打开小程序的方法

    很久没有写博客了,之前换了一份工作,很久没有做Android开发了,现在转做前端开发了,记录一下遇到的问题及解决的方法. 最近做微信小程序开发,遇到一个需求,后台管理系统生成的问卷和投票会有一个二维码 ...