题目

修改矩阵中的数字,使其成为黑白矩阵。即: (i,j)位置元素的上下左右都两两相同,但是与其不同。不在矩阵范围内的上下左右不考虑。

输入:n,m n行元素,每行m个
输出:修改次数,是一个值

输入示例:
3 3
1 1 1
1 5 1
1 1 1输出:
4

思路

变成黑白矩阵,矩阵中最后只有两种数字,即一种黑,一种白


结果就是圆圈的位置是一种,可以叫做黑,三角的位置是一种,可以叫做白。

根据图可以得到规律,当 行号 % 2 == 列号 % 2 时是一种,否则是另一种,这样就可以得到黑数组和白数组。
要使黑数组中的数全部变成相同的,那么保留重复次数最多的数,修改其他的数,白数组同理。
矩阵的总数 减去 两个重复最多次数的和就是需要修改的次数。
比如 3 * 3的矩阵,黑数组 5 个元素,有3个相同的,那么需要修改的次数就是 2
白数组 4 个元素,有 3 个相同的,那么需要修改的次数就是 1
当这两个数组重复的数不是相同的,比如 黑数组中 3 重复次数最多,白数组 1 重复次数最多,那么直接用矩阵总数 9 减去
黑数组重复元素次数 3 再减去 白数组重复次数 3 结果就是 3

另一种情况,如果黑白数组重复次数最多的元素相同,比如都是 1 重复次数最多, 那么就需要求出黑白数组的第二重复最多的次数a2, b2
然后 a1 + b2 和 a2 + b1哪个大,最终就减去哪个(a1 是黑数组重复次数第一多的,b1是白数组重复次数第一多的)

具体见代码:

#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;// 修改矩阵中的数字,使其变为黑白矩阵,即某元素的上下左右元素都相同,且与此元素不同。求最小的修改次数// 存储最大重复次数的值和次数
typedef struct MaxPair
{int time;int val;
};// 找到最大重复次数和值
MaxPair findMaxPair(unordered_map<int, int> mp)
{unordered_map<int, int>::iterator iter = mp.begin();MaxPair maxP;maxP.time = 0;//int max = 0;for (; iter != mp.end(); iter++){if (iter->second >= maxP.time){maxP.time = iter->second;maxP.val = iter->first;}}return maxP;
}// 找到除某个数外,其余数中重复次数最大的数
MaxPair findMaxPairEK(unordered_map<int, int> mp, int k)
{unordered_map<int, int>::iterator iter = mp.begin();MaxPair maxP;maxP.time = 0;//int max = 0;for (; iter != mp.end(); iter++){if (iter->second >= maxP.time && iter->first != k){maxP.time = iter->second;maxP.val = iter->first;}}return maxP;
}
int main()
{int m, n;int val;cin >> m >> n;vector<vector<int>> arr;for (int i = 0; i < n; i++){vector<int> sArr;for (int j = 0; j < m; j++){cin >> val;sArr.push_back(val);}arr.push_back(sArr);}vector<int> black;vector<int> white;// 黑白数组初始化for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){if (i % 2 == j % 2){black.push_back(arr[i][j]);}else{white.push_back(arr[i][j]);}}}// 计算重复数的最大值unordered_map<int, int> aMap;unordered_map<int, int> wMap;// 键值对存储重复次数unordered_map<int, int>::iterator iter;for (int i = 0; i < black.size(); i++){// 有了if ((iter = aMap.find(black[i])) != aMap.end()){(iter->second)++;}else{aMap[black[i]] = 1;}}for (int i = 0; i < white.size(); i++){// 有了if ((iter = wMap.find(white[i])) != wMap.end()){(iter->second)++;}else{wMap[white[i]] = 1;}}// 找最大值int result = 0;MaxPair amaxp = findMaxPair(aMap);MaxPair wmaxp = findMaxPair(wMap);if (amaxp.val != wmaxp.val){result = black.size() - amaxp.time;result += (white.size() - wmaxp.time);}else{int a1, b1, a2, b2;a1 = wmaxp.time;b1 = amaxp.time;a2 = findMaxPairEK(aMap, amaxp.val).time;b2 = findMaxPairEK(wMap, amaxp.val).time;int max = (a1 + b2) > (a2 + b1) ? (a1 + b2) : (a2 + b1);result = black.size() + white.size() - max;}cout << result;//system("pause");return 0;
}

如有问题还望指出

算法题:矩阵修改为黑白矩阵相关推荐

  1. 力扣算法题—074搜索二维矩阵

    编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 1: 输入: matrix ...

  2. sklearn使用投票器VotingClassifier算法构建多模型融合的软投票器分类器(soft voting)并自定义子分类器的权重(weights)、计算融合模型的混淆矩阵、可视化混淆矩阵

    sklearn使用投票器VotingClassifier算法构建多模型融合的软投票器分类器(soft voting)并自定义子分类器的权重(weights).计算融合模型的混淆矩阵.可视化混淆矩阵 目 ...

  3. sklearn使用投票器VotingClassifier算法构建多模型融合的软投票器分类器(soft voting)并计算融合模型的混淆矩阵、可视化混淆矩阵(confusion matrix)

    sklearn使用投票器VotingClassifier算法构建多模型融合的软投票器分类器(soft voting)并计算融合模型的混淆矩阵.可视化混淆矩阵(confusion matrix) 目录

  4. sklearn使用投票器VotingClassifier算法构建多模型融合的硬投票器分类器(hard voting)并计算融合模型的混淆矩阵、可视化混淆矩阵(confusion matrix)

    sklearn使用投票器VotingClassifier算法构建多模型融合的硬投票器分类器(hard voting)并计算融合模型的混淆矩阵.可视化混淆矩阵(confusion matrix) 目录

  5. Java黑皮书课后题第8章:*8.22(偶数个1)编写一个程序,产生一个6*6的填满0和1的二维矩阵,显示该矩阵,检测是否每行以及每列中有偶数个1

    *8.22(偶数个1)编写一个程序,产生一个6*6的填满0和1的二维矩阵,显示该矩阵,检测是否每行以及每列中有偶数个1 题目 题目描述 破题 代码 题目 题目描述 8.22(偶数个1)编写一个程序,产 ...

  6. 数据结构与算法之“之”字型打印矩阵和矩阵中找数

    数据结构与算法之"之"字型打印矩阵和矩阵中找数 目录 "之"字型打印矩阵 在行列都排好序的矩阵中找数 1. "之"字型打印矩阵 题目描述 思 ...

  7. 数据结构与算法之转圈打印矩阵和旋转正方形矩阵

    数据结构与算法之转圈打印矩阵和旋转正方形矩阵 目录 转圈打印矩阵 旋转正方形矩阵 1. 转圈打印矩阵 题目描述 代码实现 public class Code_PrintMatrixSpiralOrde ...

  8. 数据结构与算法--解决问题的方法-顺时针打印矩阵

    顺时针打印矩阵 题目输入一个矩阵,按照从外向里顺时针的顺序依次打印每一个数字.例如下案例: 如上图矩阵,顺时针打印:1,2,3,4,8,12,16,15,14,13,9,5,6,7,1,10 以上问题 ...

  9. 低秩矩阵补全算法matlab实现,推荐系统中的矩阵补全算法

    最基本的问题,以用户电影评分为例,也就是这个用户-电影矩阵. 表中是用户多电影的评分,但评分有缺失,因为用户不可能对所有电影作出评价. 那么推荐问题就是给用户合理推荐一个没看过的电影,合理是指,预测用 ...

  10. 矩阵乘法 算法训练 试题_线性代数入门——矩阵乘法的定义及其意义

    系列简介:这个系列文章讲解线性代数的基础内容,注重学习方法的培养.线性代数课程的一个重要特点(也是难点)是概念众多,而且各概念间有着千丝万缕的联系,对于初学者不易理解的问题我们会不惜笔墨加以解释.在内 ...

最新文章

  1. 操作系统安全加固原理
  2. linux 网卡无效 设置_windows使用xftp连接本机上的linux虚拟机
  3. React Native在Android当中实践(五)——常见问题
  4. java中为按钮添加图片_我们可以在Java接口中为成员定义私有和受保护的修饰符吗?...
  5. php文章远程图片,php实现异步将远程链接上内容(图片或内容)写到本地的方法
  6. vmware workstation不可恢复错误:(vthread-7)
  7. python ctypes实现api测试_Windows下通过Python 3.x的ctypes调用C接口
  8. 空间数据挖掘主要方法
  9. 数据库课程设计——员工培训管理系统
  10. 微型计算机原理与接口技术综述论文,微型计算机原理接口与技术综述论文汇编.doc...
  11. WordPress实现前台登录or注册功能
  12. JS效果-灯箱效果-图片大图查看
  13. 微信公众号开发C#系列-1、微信公众平台注册
  14. test1asfd 按时收费的水电费阿萨德阿斯蒂芬啊
  15. 简单的猜字游戏Java版
  16. 丈人/丈母娘,岳父/岳母、妈/母亲/娘 的解释
  17. 怎么windows设置qq邮箱服务器,电脑中如何添加QQ邮箱到Windows Live Mail
  18. 华为云开发者官网首页焕新升级,赋能开发者云上成长
  19. 系列服务器大概多重,一台服务器有多重
  20. HBase数据大批量导入方式总结和对比

热门文章

  1. 深度学习环境配置:2080Ti+Ubuntu16.04+CUDA10+cuDNN7.3+TensorFlow-gpu1.12
  2. OPICS 节假日维护
  3. 帆软大数据自定义分页
  4. U盘被写保护无法格式化(我用win10,同样成功格式化了U盘)
  5. ape是什么格式?ape怎么转mp3?
  6. Methodology写作之定性分析详解
  7. spring boot 集成paypal支付 rest api v2的实现
  8. 关键词挖掘的9种方法
  9. 我的口琴之路(附c调简谱)--------一个命中注定音乐巅峰是小星星的男人
  10. Java之图片添加文字