当前位置: 首页 > news >正文

江门云建站模板东城企业网站开发

江门云建站模板,东城企业网站开发,淘宝客自建手机网站,做网站服务器怎么用题目如下: 本题要求用贪心算法使得出动最少的机器人来收集场上所有的硬币,首先容易想到的是设计算法使得机器人每次行动都尽可能收集数量最多的硬币,但是实际上此解法并不可行,如以下这种情况: 优先找数量最多的话那么应当是&am…

题目如下:
在这里插入图片描述
本题要求用贪心算法使得出动最少的机器人来收集场上所有的硬币,首先容易想到的是设计算法使得机器人每次行动都尽可能收集数量最多的硬币,但是实际上此解法并不可行,如以下这种情况:
在这里插入图片描述
优先找数量最多的话那么应当是:在这里插入图片描述

以上四种情况,但是实际应当是三种最少,因此优先金币最多是错误的,考虑新的思路。

注意到若两金币其中一个金币在另一个金币的右上方则必须出动两个机器人,如下:
在这里插入图片描述
(2, 2)和(3, 3)的机器人是不可能用同一个机器人访问的,因此我们将满足这种关系(一个在另一个的右上角)的硬币分成不同组,这样不同组间的硬币不可能用一个机器人访问到,我们只需要统计总共分为了几组就好。在实际解决中,考虑遍历图中任意两硬币来分组,但是这样要考虑的组合数为Cn2,并且代码结构并不清晰,因此思考别的方式。

我们并不需要考虑任意两点,只需要找到最大组合数就好了,因此完全可以按列来,首先选择第一列的最下面的金币(如果有),我们就看第二列存不存在比第一列y值小的,即右上方的金币,这里同样要找最靠下的。比如第一列y=4,第二列y=2和y=3都有金币,那么我们选择y=3的。重复以上,比如第二列找到y=3的,那么就找第三列存不存在比第二列y值小的,即右上方的金币。这样我们就算出了从第一列开始的不同组的金币组数,那么我们再从第二列开始,直到最后一列,最终计算出整张图的最大不同组的金币组数,即为答案。

接下来我们看代码:
图使用二维数组:

  #include<bits/stdc++.h>
// 机器人收硬币 
using namespace std;vector<vector<int>> arr = {{1, 0, 0, 1, 0, 0},{0, 1, 1, 0, 1, 0},{0, 1, 1, 0, 0, 0},{0, 1, 1, 1, 0, 0},{0, 1, 0, 1, 1, 0}
};
int max_num = 0;
int rows = arr.size();    // 网格的行数
int cols = arr[0].size(); // 网格的列数

然后我们定义核心函数:


int findOne(int x, int y){int i = x+1;int num = 1; // 下一列 while(i < cols){int y_end = -1;for(int j=0;j<rows;j++){if(arr[j][i] == 1 && j < y){y_end = j;}}if(y_end == -1){cout<<i<<"列没有找到"<<endl;}else{cout<<x<<","<<y<<"右上角的坐标已找到"<<i<<","<<y_end<<endl;cout<<"连续斜线的点数量为"<<num+1<<"-------!"<<endl;num++;y = y_end;}// 下一列 i = i+1;}			return num;
} 

这个函数的作用是输入一个节点的坐标,能够计算出从这一列开始的不同组的金币数,我们还是举个例子:
在这里插入图片描述
比如从第二列的最后一个点开始(1, 4),第三列的倒数第二个点是无法用同一个机器人访问的该列的最后一个点,然后算法会从这个点开始(2, 3),再找出第四列的第一个点(无法用同一个机器人访问的该列的最后一个点)(3,0),然后第五,六列就没有符合的点了,因此从第二列开始的最大不同组数为 3, 包含第二列能找到三个点。
在这里插入图片描述

然后我们主函数内只需要用两个for循环分别找每列的最后一个点即可:

	for(int i=0;i<cols;i++){int y_end = -1;for(int j=0;j<rows;j++){if(arr[j][i] != 0){y_end = j;}}// 找到最后的y,进入函数 if(y_end != -1){cout<<"----------找到了x:"<<i<<" y:"<<y_end<<"的最后一个点,进入循环------"<<endl;int num = findOne(i, y_end);if(num > max_num){max_num = num;}}}

以下是完整代码:

#include<bits/stdc++.h>
// 机器人收硬币 
using namespace std;vector<vector<int>> arr = {{1, 0, 0, 1, 0, 0},{0, 1, 1, 0, 1, 0},{0, 1, 1, 0, 0, 0},{0, 1, 1, 1, 0, 0},{0, 1, 0, 1, 1, 0}
};
int max_num = 0;
int rows = arr.size();    // 网格的行数
int cols = arr[0].size(); // 网格的列数int findOne(int x, int y){int i = x+1;int num = 1; // 下一列 while(i < cols){int y_end = -1;for(int j=0;j<rows;j++){if(arr[j][i] == 1 && j < y){y_end = j;}}if(y_end == -1){cout<<i<<"列没有找到"<<endl;}else{cout<<x<<","<<y<<"右上角的坐标已找到"<<i<<","<<y_end<<endl;cout<<"连续斜线的点数量为"<<num+1<<"-------!"<<endl;num++;y = y_end;}// 下一列 i = i+1;}			return num;
} int main(){for(int i=0;i<cols;i++){int y_end = -1;for(int j=0;j<rows;j++){if(arr[j][i] != 0){y_end = j;}}// 找到最后的y,进入函数 if(y_end != -1){cout<<"----------找到了x:"<<i<<" y:"<<y_end<<"的最后一个点,进入循环------"<<endl;int num = findOne(i, y_end);if(num > max_num){max_num = num;}}}cout<<"至少派出机器人数量为:"<<max_num;return 0;
} 

让我们尝试一个案例:
在这里插入图片描述
若是用贪心,每次尽可能最多的收集金币,机器人数量4,但是实际答案应该为三。
算法输出:
在这里插入图片描述
end

http://www.dtcms.com/a/494786.html

相关文章:

  • 使用Selenium Server 4连接已经运行的Firefox
  • 普蓝机器人PlanRobot-DR200:基于多传感融合的全天候电力巡检自主导航技术与实践
  • PHPCMS V9 自定义证书查询模块(Ajax+防刷+倒计时)
  • 一体化运维平台:当下运维体系的核心支柱
  • HarmonyOS后台任务管理:短时任务与长驻任务实战
  • Unity游戏基础-6(跨平台生成游戏作品,针对安卓教程)
  • Luminex xMAP技术原理与应用概述
  • Http基础协议和解析
  • 官方网站页面尺寸html网页设计作品中国传统文化
  • h5游戏免费下载:激射神经猫
  • 商业航天与数字经济(二):商业航天重构全球数字经济的底层逻辑
  • 免费社区建站系统vue做的商城网站
  • 中电金信:首个金融信创中试平台揭牌,架设国产软硬件落地应用的“高速通道”
  • 主流移动通信标准
  • SNK施努卡驱动电机自动生产线,转子+电机总成含EOL测试
  • 解决方案 - 宽带多通道同步采集系统
  • Nginx、uwsgi、uWSGI、WSGI和Django的关系
  • 牛童三国单机游戏Unity源码 免费开源
  • 团工作网站建设意见网站编辑做图片用什么不同
  • C#,VB.NET数组去重复,提取键名和重复键和非重复键
  • java建筑工地智能交互平台源码,智慧工地SaaS云平台,对现场人员、材料、机械、质量、安全进行高效管控
  • 【计算机网络笔记】计算机网络学习笔记1
  • 企业网站添加栏目龙华建网站多少钱
  • 建安证查询网站制作二维码网站免费
  • iOS八股文之 内存管理
  • Rhino 8 for Mac 犀牛3D建模软件
  • IOS/ 安卓开发工具按键精灵Sys.GetAppList 函数使用指南:轻松获取设备已安装 APP 列表
  • 数字化转型从来不是上套系统那么简单
  • 探索 MaynorAI:你的一站式 AI 服务平台
  • 购物网站建设ppt全国网站建设公司