模拟算法 蓝桥杯备赛系列 acwing

文章目录:

基础知识


什么是模拟?


例题



一、错误票据

1.解题思路

2.代码


二、移动距离


1.解题思路

2.代码


三、航班时间


1.解题思路

2.代码

四、外卖优先级

1.解题思路

2.代码

前面为了目录好看大家就当个玩笑看吧哈哈哈。下面上正文。

                                              正文

基础知识
什么是模拟?
模拟一个很宽泛的内容,比如字符串处理,日期处理。凡是不是很复杂但是没有标准归类的题目都可以称为模拟。

枚举和模拟是没有什么算法可言的,按照题目说的意思去模拟一下即可,要求对语法代码的熟练度比较高。

模拟题是有唯一解的,而不是求最优解的问题,只不过模拟题实现起来比较麻烦。

      这个是引用某个大佬的内容: 模拟算法是一种最基本的算法思想,是对程序员基本编程能力的一种考查,其解决方法就是根据题目给出的规则对题目要求的相关过程进行编程模拟。在解决模拟类问题时,需要注意字符串处理、特殊情况处理和对题目意思的理解。我们知道在C语言中,通常使用函数srand()和rand()来生成随机数。其中函数srand()用于初始化随机数发生器,然后使用函数rand()来生成随机数。如果要使用上述两个函数,则需要在源程序头部包含time.h文件。在程序设计过程中,可使用随机函数来模拟自然界中发生的不可预测情况。在解题时,需要仔细分析题目给出的规则,要尽可能地做到全面地考虑所有可能出现的情况,这是解模拟类问题的关键点。

二、错误票据
1.解题思路

步骤:
①输入:都输入到一个数组中

本题比较坑的是注意输入,只告诉了有多少行,没告诉每行有多少个数。每行有多少个数需要自己处理 。

int a[100010];    
int k=0;
int x;
while(cin>>x)  //这行会把每个出现的数都存到a[]数组中
{a[k++]=x;
}

②从小到大排序

③循环遍历数组

找重号:如果相邻两个数相等,那么这个就是重号

找断号 :如果相邻的两个数相差2,那么两数中间的就是断号

2.代码

做题先暴力,下面是暴力代码

//另一种方法:暴力模拟法#include <iostream>
#include <algorithm>
using namespace std;
int a[100010];
int main()
{int n;cin>>n;int k=0;//第一步:输入数据,合并到一个数组中int x;while(cin>>x){a[k++]=x;}// for(int i=0;i<k;i++) cout<<a[i]<<" ";//第二步:排序sort(a,a+k);//第三步:求重号:利用桶的思想,找到第一个重复的数据,记录int t[100010],ans2=0;for(int i=0;i<k;i++){t[a[i]]++;}for(int i=0;i<=100000;i++){if(t[i]>=2){ans2=i;break;}}//第四步:求断号:先给序列去重,再利用下标和排好序的序列,找断号,注意边界int z[100010],j=0;for(int i=0;i<k;i++){if(a[i]==a[i-1]) continue;else z[j++]=a[i];}//for(int i=0;i<j;i++) cout<<z[i]<<" ";int q=z[0],ans1=0;for(int i=0;i<j;i++){if(z[i]==q) {q++;continue;   }else {ans1=q;break;}}cout<<ans1<<" "<<ans2;return 0;}

下面这是正常做法 

#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>using namespace std;const int N = 10010;int n;
int a[N];int main()
{int cnt;cin >> cnt;string line;getline(cin, line); // 忽略掉第一行的回车while (cnt -- ){getline(cin, line);stringstream ssin(line);while (ssin >> a[n]) n ++ ;}sort(a, a + n);int res1, res2;for (int i = 1; i < n; i ++ )if (a[i] == a[i - 1]) res2 = a[i];  // 重号else if (a[i] >= a[i - 1] + 2) res1 = a[i] - 1; // 断号cout << res1 << ' ' << res2 << endl;return 0;
}

二、移动距离
1.解题思路

题目中遇到距离一般有两种:曼哈顿距离 和 欧几里得距离

曼哈顿距离:|x1-x2|+|y1-y2| 两点之间走过的折线距离
欧几里得距离:sqrt((x1-x2) * (x1-x2)+(y1-y2) * (y1-y2)) 两点间的直线距离

本题所有点的坐标其实就是行号和列号

可以借鉴c++中二维数组的行号和列号下标表示:让编号从0开始标号,所以让m,n一开始都-1,不需要特判边界了。所以 行号:n/w m/w ,列号:n%w m%w

又因为本题编号是蛇形递增+1的,所以只需要判断是奇数行还是偶数行

偶数行不用变,奇数行逆序:if n/w 是奇数 ,w-1-n%w
2.代码

//时间复杂度O(1)
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;int main()
{int w, m, n;cin >> w >> m >> n;m --, n -- ; //让编号从0开始int x1 = m / w, x2 = n / w;  //两个点的行号int y1 = m % w, y2 = n % w;  //两个点的列号if (x1 % 2) y1 = w - 1 - y1; //第一个点行号如果是奇数行,列号就反转一下if (x2 % 2) y2 = w - 1 - y2; //第二个点行号如果是奇数行,列号就反转一下cout << abs(x1 - x2) + abs(y1 - y2) << endl;  //求出两点之间的曼哈顿距离return 0;
}
三、航班时间
1.解题思路

通过分析,可以得到:

飞行时间=[(去的结束时间-去的起始时间)+(回的结束时间-回的起始时间)]/2

步骤:

①字符串格式化输入:这道题目麻烦就是麻烦在字符串的格式处理上

getline(cin,line);//忽略第一行的回车
int fh1,fm1,fs1,fh2,fm2,fs2,fd=0;
scanf("%d:%d:%d %d:%d:%d (+%d)",&fh1,&fm1,&fs1,&fh2,&fm2,&fs2,&fd);//注意输入时(+%d),不匹配后就会跳过了

②将所有时间转化为距离当天00:00:00的秒数,得到飞行时间秒数time

int time1,time2,t;
time1=fd*24*3600+fh2*3600+fm2*60+fs2-(fh1*3600+fm1*60+fs1);
time2=ed*24*3600+eh2*3600+em2*60+es2-(eh1*3600+em1*60+es1);
t=(time1+time2)/2;

③再将飞行时间time转化为00:00:00这一规定时间格式:

hour=time/3600;
minute=time%3600/60
second=time%3600%60

④格式化输出:

printf("%02d:%02d:%02d\n", t/3600, t%3600/60, t%3600%60);

2.代码

#include<iostream>
#include <cstdio>
using namespace std;int main()
{int n;cin>>n;while(n--){//输入去的时候起始时间和结束时间int fh1,fm1,fs1,fh2,fm2,fs2,fd=0;scanf("%d:%d:%d %d:%d:%d (+%d)",&fh1,&fm1,&fs1,&fh2,&fm2,&fs2,&fd);//输入回的时候起始时间和结束时间int eh1,em1,es1,eh2,em2,es2,ed=0;scanf("%d:%d:%d %d:%d:%d (+%d)",&eh1,&em1,&es1,&eh2,&em2,&es2,&ed);//计算两次分别的飞行时间,和除以2为最终的飞行时间int time1,time2,t;time1=fd*24*3600+fh2*3600+fm2*60+fs2-(fh1*3600+fm1*60+fs1);time2=ed*24*3600+eh2*3600+em2*60+es2-(eh1*3600+em1*60+es1);t=(time1+time2)/2;//将秒数转化为规定格式输出printf("%02d:%02d:%02d\n", t/3600, t%3600/60, t%3600%60);}return 0;
}
//封装为函数#include<iostream>
#include<cstdio>
using namespace std;
int getTime()
{int h1,m1,s1,h2,m2,s2,d=0;scanf("%d:%d:%d %d:%d:%d (+%d)",&h1,&m1,&s1,&h2,&m2,&s2,&d);int time=d*24*3600+h2*3600+m2*60+s2-(h1*3600+m1*60+s1);return time;
}
int main()
{int t;scanf("%d",&t);for(int i = 0; i < t; i++){int time1=getTime();int time2=getTime();int t=(time1+time2)/2;printf("%02d:%02d:%02d\n", t/3600, t/60%60, t%60);}return 0;
}
四、外卖优先级
1.解题思路

在这里插入图片描述

伪代码如下:

score[i]:表示第i个店铺当前的优先级 
last[i]: 表示第i个店铺上一次有订单的时刻
st[i]:表示第i个店铺当前是否处于优先缓存中将所有订单按时间顺序排序;
for 每个订单
{每次处理一批相同的订单;id,t,cnt;//第一部分,是上一个拿到订单的时间last[id]和t之间,中间没订单所以要−1,没订单的数量是t−last[i]−1 (比如第3和第6时刻都有订单,没有订单的时候就是4,5)score[id]=t-last[id]-1;if(score[id]<0) score[id]=0;//计算优先权,如果为负值更新为0。如果小于等于3,更新优先缓存 st[id]=falseif(score[id]<=3) st[id]=false;//第二部分,是此时,tt时刻拿到订单,并且拿到的数量为cntcnt,要加上2∗cntscore[id]+=cnt*2;if(score[id]>5) st[id]=true;//计算优先权,如果大于5,更新优先缓存 st[id]=true
}
for(int i=1;i<=n;i++)
{if(last[i]<T) {score[i]-=T-last[i];if (score[i] <= 3) st[i] = false;}
}res = 0;
for(int i=1;i<=n;i++)
{res+=st[i];
}

2.代码 

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>#define x first
#define y secondusing namespace std;typedef pair<int, int> PII;const int N = 100010;int n, m, T;
int score[N], last[N];
bool st[N];PII order[N];int main()
{scanf("%d%d%d", &n, &m, &T);for (int i = 0; i < m; i ++ ) scanf("%d%d", &order[i].x, &order[i].y);sort(order, order + m);for (int i = 0; i < m;){int j = i;while (j < m && order[j] == order[i]) j ++ ;int t = order[i].x, id = order[i].y, cnt = j - i;i = j;
/*
while (j < m && order[j] == order[i]) j ++ ;和cnt = j - i;是为了算出来同一时刻同一家店的订单数量,数量就是cnt的值,这个数量可能不唯一。
第一次while()循环中的order[j] == order[i]是一定成立的,然后j ++,j 就变成 i + 1,再比较order[i]和order[i + 1]是否相等,含义就是下一个订单与当前这个订单是不是同一时刻同一家店的,直到时刻或者 id 不同时,结束while循环,最后 j 就指向“不重复”的第一个订单,然后令 i = j,继续枚举所有订单
写成:int j = i + 1;,其它语句都不改动,也是对的,我感觉更好理解
*/score[id] -= t - last[id] - 1;if (score[id] < 0) score[id] = 0;if (score[id] <= 3) st[id] = false; score[id] += cnt * 2;if (score[id] > 5) st[id] = true;last[id] = t;}for (int i = 1; i <= n; i ++ )if (last[i] < T){score[i] -= T - last[i];if (score[i] <= 3) st[i] = false;}int res = 0;for (int i = 1; i <= n; i ++ ) res += st[i];printf("%d\n", res);return 0;
}

最近博主有事,暂且停更,一天一篇博客确实很有压力的,所以说待博主沉淀亿下给大家更多优质内容哈哈哈!元旦过后见! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/581590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode刷题---合并区间

解题思路&#xff1a; 一次遍历&#xff0c;首先按照每个元素区间的start来排序&#xff0c;之后定义一个列表将第一个元素添加进去&#xff0c;依次遍历数组的每个元素&#xff0c;如果第二个元素区间的start小于或者等于第一个元素区间的end&#xff0c;则证明两个区间是重叠…

第27关 在K8s集群上使用Helm3部署最新版本v2.10.0的私有镜像仓库Harbor

------> 课程视频同步分享在今日头条和B站 大家好&#xff0c;我是博哥爱运维。 在前面的几十关里面&#xff0c;博哥在k8s上部署服务一直都是用的docker hub上的公有镜像&#xff0c;对于企业服务来说&#xff0c;有些我们是不想把服务镜像放在公网上面的&#xff1b; 同时…

Jmeter接口工具大全使用—响应断言

断言的作用&#xff1a;一个HTTP请求发出去&#xff0c;怎么判断执行的任务是否成功呢&#xff1f;通过检查服务器响应数据&#xff0c;是否返回预期想要的数据&#xff0c;如果是&#xff0c;判断任务成功&#xff0c;反之任务失败。 1.添加断言 选中一个取样器&#xff0c;…

java基础-回忆性记录

java基础 Java概括 jaava是一种计算机交流的高级编程语言&#xff0c;1995年java衍生&#xff0c;詹姆斯高斯林被世人称之为java之父。 java语言具有跨平台性 java程序并非可以直接运行的&#xff0c;在java程序编译完成后会形成与编译无关的class文件。Java具有跨平台性&a…

智慧监控平台/AI智能视频EasyCVR接口调用编辑通道详细步骤

视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;GB28181视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多路视频流&#xff0c…

Python关键字之旅:一步步掌握Python的奥秘

文章目录 一、前言二、关键字1.总表&#xff08;共35个&#xff09;2.拆分2.1 False None True2.2 and not or2.3 as from import2.4 assert2.5 async await2.6 break continue2.7 class def2.8 del2.9 if elif else2.10 try except finally raise2.11 for in while2.12 global…

Vue框架引入Axios

首先已经创建好了 Vue 框架&#xff0c;安装好了 node.js。 没有完成的可按照此博客搭建&#xff1a;搭建Vue项目 之后打开终端&#xff0c;使用命令。 1、命令安装 axios 和 vue-axios npm install axios --save npm install vue-axios --save2、package.json 查看版本 在 p…

06. Springboot admin集成Actuator(二)

目录 1、前言 2、快速使用 2.1、服务端集成 2.1.1、添加依赖 2.1.2、配置启动类 2.1.3、配置application.yml 2.1.4、定制security config 2.1.5、启动程序 2.2、客户端集成 2.2.1、添加依赖 2.2.2、配置application.yml 2.2.3、启动程序 2.3、告警通知 2.3.1、邮…

arr.sort((a,b)=>a-b)

当你需要对一个数组进行正排序和逆向排序的时候,选择arr.sort((a,b)>a-b)方法

【K8S 部署】基于kubeadm搭建Kurbernetes集群

目录 一、基本架构 二、环境准备: 三、安装部署 1、所有节点安装docker 2、、所有节点安装kubeadm&#xff0c;kubelet和kubectl 3、配置网络--flannel 4、测试 pod 资源创建 四、安装部署与k8s集群对接的Harbor仓库 五、Dashboard安装部署&#xff1a; 一、基本架构…

软件测试/测试开发丨Pytest 参数化用例

参数化 通过参数的方式传递数据&#xff0c;从而实现数据和脚本分离。并且可以实现用例的重复生成与执行。 参数化应用场景 测试登录场景 测试登录成功&#xff0c;登录失败(账号错误&#xff0c;密码错误)创建多种账号: 中⽂文账号&#xff0c;英⽂文账号 普通测试用例方法 …

纷享销客华为云:如何让企业多一个选择?

纷享销客携手华为云推出多项联合解决方案&#xff0c;为企业的数字化提供了一个新选择。12月12日&#xff0c;纷享销客&华为云联合解决方案发布会在北京举办。本次发布会以“「CRM云」让企业多一个选择”为主题&#xff0c;来自行业头部企业的CEO、CIO、业务负责人等&#…

AGV智能搬运机器人-替代人工工位让物流行业降本增效

在当今快速发展的世界中&#xff0c;物流业面临着巨大的挑战&#xff0c;包括提高效率、降低成本和优化工作流程。为了应对这些挑战&#xff0c;一种新型的自动化设备——智能搬运机器人正在崭露头角。本文将通过一个具体的案例来展示富唯智能转运机器人在实际应用中的价值。 案…

C++:map和set的介绍及使用

目录 1. 关联式容器 2. 键值对 3. 树形结构的关联式容器 3.1 set 3.1.1 set的介绍 3.1.2 set的使用 3.2 map 3.2.1 map的介绍 3.2.2 map的使用 3.3 multiset 3.3.1 multiset的介绍 3.3.2 multiset的使用 3.4 multimap 3.4.1 multimap的介绍 3.4.2 multimap的使用…

如何安装T4显卡的驱动

文章目录 一、没有驱动的报错现象二、cuda版本与驱动的版本对应关系三、安装驱动方法1&#xff1a;方法2&#xff1a; 一、没有驱动的报错现象 ERROR: Unable to find the kernel source tree for the currently running kernel. Please make sure you have installed the ker…

数字时代跨境电商营销大变革:海外网红营销的力量与影响

随着全球化的推进和数字技术的不断发展&#xff0c;跨境电商行业迎来了一场营销变革的浪潮。在这个过程中&#xff0c;一种新的营销方式崭露头角&#xff0c;那就是海外网红营销。海外网红以其独特的个人魅力和影响力&#xff0c;成为跨境电商推广的重要力量&#xff0c;为品牌…

Flink1.17实战教程(第五篇:状态管理)

系列文章目录 Flink1.17实战教程&#xff08;第一篇&#xff1a;概念、部署、架构&#xff09; Flink1.17实战教程&#xff08;第二篇&#xff1a;DataStream API&#xff09; Flink1.17实战教程&#xff08;第三篇&#xff1a;时间和窗口&#xff09; Flink1.17实战教程&…

设计模式(4)--对象行为(7)--观察者

1. 意图 定义对象间的一种一对多的依赖关系&#xff0c; 当一个对象的状态改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 2. 四种角色 抽象目标(Subject)、具体目标(Concrete Subject)、抽象观察者(Observer)、 具体观察者(Concrete Observer) 3. 优点 3.1 …

模型量化 | Pytorch的模型量化基础

官方网站&#xff1a;Quantization — PyTorch 2.1 documentation Practical Quantization in PyTorch | PyTorch 量化简介 量化是指执行计算和存储的技术 位宽低于浮点精度的张量。量化模型 在张量上执行部分或全部操作&#xff0c;精度降低&#xff0c;而不是 全精度&#xf…

HTML+CSS制作动漫绿巨人

🎀效果展示 🎀代码展示 <!DOCTYPE html> <html lang="en" > <head>