题面:

传送门

题目描述:

给出两个n*m的矩阵,问:是否能通过交换两个矩阵“对应”位置的元素,使两个矩阵都为“递增”矩阵。
“递增”矩阵定义:每行和每列都要“递增”。
 

题目分析:

这道题就是个贪心水题,但是我刚开始就是胡思乱想,思路根本不对,再加上放假后的懒惰,就。。。进入正题:
 
我们可以想出这样一种贪心策略:让前面的值尽可能小,后面才有更大的机会成为“递增”矩阵。我们根据这个贪心策略,可以推出一些东西:
注:下面的a,b是两个题目给出的矩阵
假设我要让a(i, j)尽可能小,也就是:如果a(i, j) > b(i, j),那么就交换a(i, j)和b(i, j),否则不交换。
接下来我们看a(i+1, j)怎么处理?由贪心策略可知,a(i+1, j)和a(i, j)的处理方式一样。
所以,第一步,我们先使矩阵a的所有元素,小于等于矩阵b的所有元素。这时有:a(i, j) <= b(i, j)   (1 <= i <= n, 1 <= j <= m)
 
第二步,我们直接“贪心地选择”:检查a矩阵是否递增,如果不递增,就交换。如果交换后还不是严格递增就是“impossible”。
为什么?由于我们按照前面的贪心策略设置后,前面的值已经是在合法的情况下是最小的了,如果通过这次交换都不能符合严格递增,就是“impossible”。
 
检查完a矩阵后,直接看b矩阵是否合法。如果b矩阵不是每行每列严格递增,就是“impossible”,为什么?
当b矩阵有某行(列)的某个元素不是严格递增时,肯定要通过“交换”来符合某行(列)递增,但问题是:
假如b(i, j)在检查a矩阵时没交换过,也就是a(i, j) <= b(i, j)。大的(b(i, j))都不能满足递增,交换后小的(a(i, j))更不能满足递增了。
假如b(i, j)在检查a矩阵时交换过,也就是说,因为a矩阵不符合题意才交换的,这时如果再交换一次,虽然b矩阵可能符合题意,但是a矩阵又不符合题意了。
综上,只要b矩阵不合法,就输出"impossible"。
 
 
AC代码(ps:之前我想边交换边检查a矩阵,但是老是wa,所以最终写了个交换完后再检查的代码):
 1 #include <iostream>
2 #include <cstdio>
3 using namespace std;
4 int n, m;
5 int a[55][55], b[55][55];
6  
7 bool check(int a[][55], int mode){ //mode == 1: 对矩阵a进行操作, mode == 2: 检查是否合法
8 for(int i = 0; i < n; i++){
9 for(int j = 0; j < m; j++){
10 if(i > 0 && a[i-1][j] >= a[i][j]){
11 if(mode) swap(a[i][j], b[i][j]);
12 else return false;
13 }
14 if(j > 0 && a[i][j-1] >= a[i][j]){
15 if(mode) swap(a[i][j], b[i][j]);
16 else return false;
17 }
18 }
19 }
20 return true;
21 }
22  
23 void init(int a[][55]){
24 for(int i = 0; i < n; i++){
25 for(int j = 0; j < m; j++){
26 scanf("%d", &a[i][j]);
27 }
28 }
29 }
30  
31 int main(){
32 scanf("%d%d", &n, &m);
33 init(a); init(b);
34  
35 for(int i = 0; i < n; i++){
36 for(int j = 0; j < m; j++){
37 if(a[i][j] > b[i][j]){
38 swap(a[i][j], b[i][j]); //第一步
39 }
40 }
41 }
42  
43 //第二步
44 check(a, 1); //需要交换就交换
45  
46 if(!check(a, 0) || !check(b, 0)){ //检查矩阵a和矩阵b是否合法
47 printf("Impossible\n");
48 return 0;
49 }
50 printf("Possible\n");
51 return 0;
52 }
 
 
 
 
 

最新文章

  1. C语言-纸牌计算24点小游戏
  2. 【Mocha.js 101】同步、异步与 Promise
  3. Java EE开发平台随手记1
  4. floor相关
  5. [转]说说C语言运算符的&ldquo;优先级&rdquo;与&ldquo;结合性&rdquo;
  6. 转载:CSS3 圆角(border-radius)
  7. The builder launch configuration could not be found
  8. Fastjson Feathure
  9. C# Lazy&lt;T&gt;(转)
  10. android 细节之 旋转动画
  11. Mac实用操作技巧(三)
  12. 常系数齐次线性递推 &amp; 拉格朗日插值
  13. SQL Server 实现类似C#中 PadLeft功能
  14. [JavaScript] AMD和CMD概述
  15. 解决在vscode中eslint在vue后缀文件中保存时无法自动格式化的问题
  16. mlsql 基本操作
  17. pandas常用
  18. 混沌数学之离散点集图形DEMO
  19. Phaser3 对象池随机产生炸弹并销毁
  20. winform datagridview数据显示不全

热门文章

  1. wordpress 插件安装 Too Many Requests
  2. PAT L2-005. 集合相似度 【stl set】
  3. HDU 3681 Prison Break(状压DP + BFS)题解
  4. mitmproxy 代理工具介绍:rewrite和map local实现
  5. 力扣1689. 十-二进制数的最少数目-C语言实现-中等难度题
  6. WebAR in Action
  7. nvm install node error
  8. NGK生态商城即将上线官网,推动生态落地应用
  9. BGV作为拥抱新时代的DeFi项目,是否有能力超越YFI?
  10. K8S部署Redis Cluster集群(三主三从模式) - 部署笔记