2024.5.28晚训题解

提前预告,市赛初中组会考算法题,应该会有两道模板题
比如DFS BFS 二分 简单动态规划,虽然我们没学多久,但是模板题你还是要会写的

A题 编辑距离 动态规划
注意多组输入

#include<iostream>
using namespace std;
int dp[1005][1005];
//dp[i][j]把s字符串的前i个经过一系列操作变成b字符串的前j个的最小代价 
char s[1005];
char b[1005];
int main(){int n,m;while(scanf("%d%s%d%s",&n,s+1,&m,b+1)!=EOF){for(int i=0;i<=m;i++){dp[0][i]=i; //插入 }for(int i=0;i<=n;i++){dp[i][0]=i; //删除 }for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(s[i]==b[j])dp[i][j]=dp[i-1][j-1];//此时i j位置相同,可以直接从s[i-1]->b[j-1] 转移过来else{dp[i][j]=min(dp[i-1][j-1]+1,min(dp[i-1][j]+1,dp[i][j-1]+1));/*dp[i-1][j]+1 表示我们把s[1~i] 删掉i位置,得到s[1~i-1]  从它变到b[1~j]  dp[i][j-1]+1 表示我们把s[1~i]  从它变到b[1~j-1]  然后插入一个b[j] dp[i-1][j-1]+1    从s[1~i-1]  从它变到b[1~j-1]   对于s[i] 直接修改为b[j]   */} }}printf("%d\n",dp[n][m]);}return 0;
}

B题 最长上升子序列 (N^2)版本

#include<iostream>
using namespace std;
int A[1005];
int dp[1005]; //dp[i]表示以A[i]结尾的最长上升子序列元素 
int main(){int n;scanf("%d",&n);int ans=1;for(int i=1;i<=n;i++){dp[i]=1;scanf("%d",&A[i]);for(int j=i-1;j>=1;j--){if(A[j]<A[i]){dp[i]=max(dp[i],dp[j]+1);}}//考虑拼接的方法,想寻得dp[i],往前面找,跟某个元素拼接起来  形成以A[i]//结尾的上升子序列,那么所有的子序列取max也就是最大的   ans=max(ans,dp[i]);//但是答案不一定是以A[n]结尾  }printf("%d",ans);return 0;
}

当然,其实还有优化写法,利用二分,即可实现NlogN 的时间复杂度
我建议还是背一下(理解一下)
代码不是完全的,请看看思路

ll dp[N];
ll a[N];
ll b[N];
signed  main() {ll n;read(n);for(int i=1; i<=n; i++) {read(a[i]);}ll cnt=0;for(int i=1; i<=n; i++) {if(cnt==0||a[i]>dp[cnt]) {dp[++cnt]=a[i];//首位置要放入元素//如果当前元素A【i】比当前序列结尾的还要大,放进来  上升 continue;} else {//如果当前元素A[i]≤ 序列结尾  //考虑查找序列里面合适的值,替换掉 //举例  1 100 2   //实际上用2替换100会更优,因为你过程的元素越大,越不利于后续上升dp[upper_bound(dp+1,dp+1+cnt,a[i])-dp]=a[i];}}printf("%lld",cnt);
}

右边的数字即全球通过人数
在这里插入图片描述

C题题解
我觉得这是不能错的题。 1 ∗ 1 1*1 11的格子不用说了,啥地方都能放
主要看 2 ∗ 2 2*2 22的,一个板只能放最多两个 2 ∗ 2 2*2 22
所以你要先计算出放 b b b 2 ∗ 2 2*2 22的要多少板 ,以及这些板还有多少个格子没放的。
如果多余没放的格子足够放完 a a a 1 ∗ 1 1*1 11的 ,那么答案就是 2 ∗ 2 2*2 22需要的板子数
否则你还需要用(a-多余格子) 这么多个格子去计算还需要多少块板

#include<bits/stdc++.h>
using namespace std;
int main(){int t;scanf("%d",&t);while(t--){int a,b;	scanf("%d%d",&a,&b);	int le=0;if(b%2==0)le=(15-8)*(b/2);if(b%2){le=(15-8)*(b/2)+15-4;}int ans=b/2+b%2;if(a<=le)printf("%d\n",ans);else{printf("%d\n",ans+(a-le)/15+((a-le)%15!=0));	}}return 0;
}

D题题解
这其实就是个简单的模拟题,你把输入的字符串字母sort一遍,把密码表处理出来
然后枚举字符串开始翻译就行了

#include<bits/stdc++.h>
using namespace std;
char s[200005];
char b[30];
bool vis[30];
char sw[30];
int main(){int t;scanf("%d",&t);while(t--){memset(vis,false,sizeof(vis));int n;scanf("%d",&n);scanf("%s",s+1);int len=0;for(int i=1;i<=n;i++){if(vis[s[i]-'a'])continue;else{vis[s[i]-'a']=true;b[++len]=s[i];}}sort(b+1,b+1+len);for(int i=1;i<=len/2+1;i++){sw[b[i]-'a']=b[len-i+1];sw[b[len-i+1]-'a']=b[i];}for(int i=1;i<=n;i++){s[i]=sw[s[i]-'a'];}printf("%s\n",s+1);}return 0;
}

E题题解
这个标记题需要一定数理知识
对于一个三元组 A [ i − 2 ] , A [ i − 1 ] , A [ i ] {A[i-2],A[i-1],A[i]} A[i2],A[i1],A[i] 我们得标记它们,你可以想象一下,什么样的三元组能相互之间算答案?有两个元素一样对不对,我们直接把一样的元素标记起来,记为一个二元组。

以此标记该三元组里面的二元组,按顺序标记
每次计算答案的时候,查找一下当前三元组前面,有多少个跟自己的二元组一样的三元组,该操作不保证过滤了重复元素
因此我们需要查询该三元组前面有多少个跟自己一模一样的三元组,因为一模一样是不会产生答案的,所以要减去3倍

#include<bits/stdc++.h>
using namespace std;
int A[200005];
map<pair<int,int>,int >vis_1;
map<pair<int,int>,int >vis_2;
map<pair<int,int>,int >vis_3;
map<pair<pair<int,int>,int> ,int >pre;
int main(){int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);long long int ans=0;for(int i=1;i<=n;i++){scanf("%d",&A[i]);if(i>=3){//    当前三元组A[i-2] A[i-1] A[i] //  三种可能: A[i-2]A[i]相等   A[i-1]A[i]相等   A[i-2]A[i-1]相等  这三个二元组可以作为标记去查询ans=ans+vis_1[make_pair(A[i-2],A[i-1])];//统计前面有多少个跟A[i-2] A[i-1]值一样的二元组(先不考虑前面存在跟自己完全一样的三元组,那么答案就是加这个二元组标记的个数,视作前面出现的该二元组的元素与当前A[i]都不一样)//A[i-2] A[i-1]   ?        前面的一些三元组结构//A[i-2] A[i-1] A[i]       当前三元组    ans=ans+vis_2[make_pair(A[i-2],A[i])];ans=ans+vis_3[make_pair(A[i-1],A[i])];	vis_1[make_pair(A[i-2],A[i-1])]++;vis_2[make_pair(A[i-2],A[i])]++;vis_3[make_pair(A[i-1],A[i])]++;ans=ans-3*pre[make_pair(make_pair(A[i-2],A[i-1]),A[i])];//考虑存在重复的问题,举例//如果前面有x个三元组满足值与当前三元组(A[i-2],A[i-1],A[i])一样,那么我们就多计算了x个答案,因为完全相等的三元组不产生答案贡献,枚举了三个二元组,所以减法要减去*3  pre[make_pair(make_pair(A[i-2],A[i-1]),A[i])]++;}}printf("%lld\n",ans);vis_1.clear();vis_2.clear();vis_3.clear();pre.clear();}return 0;
}

F题题解
考虑东西南北指令,划分为两部分
一个部分是: 北南凑一对,相当于抵消移动 东西凑一对,相当于抵消移动

第一部分完成后,未凑对的剩下来的只能是北/南里面的一种,剩下的我们要考虑能不能均分给两个人,同理东西

计算北南的对数,东西的对数
北南可以按A人先的顺序轮流分配
东西可以按B人先的顺序轮流分配
接下来分配剩余的未配对的,注意如果剩余奇数个,肯定不能保证最终两个人走在同一个地方

#include<bits/stdc++.h>
using namespace std;
char s[200005];
int vis[30];
int A[30];
int B[30];
int main(){int t;scanf("%d",&t);int N,S,E,W;N='N'-'A';S='S'-'A';E='E'-'A';W='W'-'A';while(t--){int n;scanf("%d",&n);scanf("%s",s+1);vis[N]=vis[S]=vis[E]=vis[W]=0;A[N]=A[S]=A[E]=A[W]=0;B[N]=B[S]=B[E]=B[W]=0;for(int i=1;i<=n;i++){vis[s[i]-'A']++;}int ns=min(vis[N],vis[S]);int ew=min(vis[E],vis[W]);//配对相消  int lens=max(vis[N],vis[S])-min(vis[N],vis[S]);int leew=max(vis[E],vis[W])-min(vis[E],vis[W]); for(int i=1;i<=ns;i++){if(i%2){A[N]++;A[S]++;}else{B[N]++;B[S]++;}}for(int i=1;i<=ew;i++){if(i%2){B[E]++;B[W]++;}else{A[E]++;A[W]++;}}//双消+偶数//单消 + 偶 if(lens%2||leew%2){printf("NO\n");}else{int op;if(vis[N]>vis[S])op=N;else op=S;A[op]+=lens/2;B[op]+=lens/2;if(vis[E]>vis[W])op=E;else op=W;A[op]+=leew/2;B[op]+=leew/2;if((A[N]+A[S]+A[E]+A[W])==0||(B[N]+B[S]+B[E]+B[W])==0){printf("NO\n");continue;}	for(int i=1;i<=n;i++){if(A[s[i]-'A']){A[s[i]-'A']--;printf("R");}else{B[s[i]-'A']--;printf("H");}}printf("\n");}}return 0;
}

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

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

相关文章

9、C#【进阶】特性

特性 文章目录 1、特性概念2、自定义特性 Attribute3、特性的使用4、限制自定义特性的使用范围5、系统自带特性1、过时特性2、调用者信息特性3、条件编译特性4、外部dll包函数特性 1、特性概念 特性是一种允许我们向程序的程序集添加元数据的语言结构 它是用于保存程序机构信息…

【机器学习300问】103、简单的经典卷积神经网络结构设计成什么样?以LeNet-5为例说明。

一个简单的经典CNN网络结构由&#xff1a;输入层、卷积层、池化层、全连接层和输出层&#xff0c;这五种神经网络层结构组成。它最最经典的实例是LeNet-5&#xff0c;它最早被设计用于手写数字识别任务&#xff0c;包含两个卷积层、两个池化层、几个全连接层&#xff0c;以及最…

ansible批量漏洞升级openssh版本

1、ansible宿主机准备好环境&#xff0c;并写好hosts文件 [rootoxidized ansible]# cat hosts [all] 10.10.200.33 10.10.200.34 10.10.200.35跑playbook之前记得提前发送秘钥 ssh-copy-id 10.10.200.33/34/352、下载好安装包&#xff0c;然后编写yml [rootoxidized ansible]…

【实用的 IDEA 配置和操作技巧总结】

前置知识 IDEA的设置快捷键为ctrlalts键&#xff0c;后文介绍IDEA常见的配置就不再赘述这一点了。 基础配置 取消默认打开上次项目 日常开发都会打开不同的项目&#xff0c;初次安装IDEA之后&#xff0c;每次打开IDEA都会开启上一次启动的项目&#xff0c;所以我们需要进入设…

0基础学习Mybatis系列数据库操作框架——Mysql的Geometry数据处理之WKB方案

大纲 序列化反序列化完整TypeHandlerSQL XML完整XML Mapper测试代码代码 在《0基础学习Mybatis系列数据库操作框架——Mysql的Geometry数据处理之WKT方案》中&#xff0c;我们介绍WTK方案的优点&#xff0c;也感受到它的繁琐和缺陷。比如&#xff1a; 需要借助ST_GeomFromText…

350种类型、10W+量级的API,企业应该怎么管?

忽如一夜春风来&#xff0c;万物皆可API。 在互联网时代&#xff0c;API无处不在&#xff1a;企业对外开放的数据、服务和业务能力&#xff0c;以API的形式提供给合作方&#xff1b;企业内部应用与应用、App与App之间的通信&#xff0c;通过API进行&#xff1b;甚至应用内部的…

php 连接sqlserver步骤

1.首先要确定使用的是sqlserver的哪个版本&#xff0c;比如sqlserver2012 2.确定服务器是64位还是32位的 3.确认一下使用php的哪个版本&#xff0c;比如php7.1 SQL Server 的 Microsoft PHP 驱动程序 Microsoft Drivers for PHP 支持矩阵 - PHP drivers for SQL Server | Mi…

怎么做好客户信息管理?

根据Forrester的调查表示&#xff0c;客户满意度的影响可能会使某些行业的收入每年增加高达 10 亿美元。而提升客户满意度的关键环节便是做好客户信息管理。但企业在进行客户信息管理中往往会遇到以下问题&#xff1a; 客户信息乱&#xff1a;客户信息存在各个 Excel表格、个人…

PMP报考条件怎么查询?如何判定自己是否符合条件?

PMP报考条件在PMI官网上就可以查询&#xff0c;PMP报考条件只需要符合项目管理培训经历和项目管理经验两个方面的要求即可&#xff0c;大家可以对照下方的规定判断自己是否符合PMP报名条件 PMP报考条件 以下是PMI&#xff08;中国&#xff09;官网对于PMP报名条件的规定&…

ubuntu strace命令

strace 是 Linux 系统中的一个调试工具&#xff0c;用于跟踪并记录系统调用&#xff08;system calls&#xff09;和信号&#xff08;signals&#xff09;。在 Ubuntu 中&#xff0c;strace 命令可以帮助开发者和系统管理员了解一个程序在运行时如何与操作系统内核进行交互&…

vue+antd实践:在输入框光标处插入内容

今天来看一个很简单的需求。 需求描述&#xff1a;在输入框光标处&#xff0c;插入指定的内容。 效果如下&#xff1a; 实现思路&#xff1a;刚开始还在想怎么获取光标的位置&#xff0c;但是发现所做的项目是基于vue3antd组件&#xff0c;那么不简单了嘛&#xff0c;只要调…

配置物联网平台 保姆级教程

一、云平台配置&#xff08;我们这里使用阿里云&#xff09; 1、注册和登录 &#xff08;1&#xff09;找到云平台官网&#xff0c;点击右上角的注册登录&#xff0c;完成之后&#xff0c;进行实名认证&#xff0c;任选一种认证方式。 ​​​​​​​ 2、实例的开通和创建 …

Scala环境的搭建

要搭建Scala&#xff0c;我们必须先下载java&#xff0c;由于我的电脑已经搭建好了环境&#xff0c;因此我这里用截图来教大家搭建环境。 可以从网上搜索安装包对其进行安装 IntelliJ IDEA – 领先的 Java 和 Kotlin IDE 不建议下载最新版的&#xff0c;大家下载的版本可以下…

本杀小程序开发实战手册:从构思到上线

一、引言 随着移动互联网的快速发展&#xff0c;剧本杀作为一种新兴的娱乐方式&#xff0c;受到了越来越多年轻人的喜爱。为了满足市场需求&#xff0c;开发一款剧本杀小程序成为了许多创业者和开发者的选择。本文将从构思、设计、开发到上线等方面&#xff0c;为您详细解析剧…

第52期|GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

万界星空科技定制化MES系统帮助实现数字化生产

由于不同企业的生产流程、需求和目标各异&#xff0c;MES管理系统的个性化和定制化需求也不同。有些企业需要将MES管理系统与ERP等其他管理系统进行集成&#xff0c;以实现全面的信息共享和协同工作。有些企业需要将MES管理系统与SCADA等控制系统进行集成&#xff0c;以实现实时…

windows ollama 指定模型下载路径

为Ollama指定模型的下载路径 在Windows系统中&#xff0c;如果想为Ollama指定模型的下载路径&#xff0c;可以通过设置环境变量来实现。以下是详细的步骤&#xff1a; 确定默认下载路径&#xff1a; 默认情况下&#xff0c;Ollama的模型可能会下载到C:\Users\<用户名>…

企业内网终端监控管理软件有哪些?推荐4款企业终端监控管理软件

企业内网终端监控管理软件是一种专为企业内部网络设计的安全与管理工具&#xff0c;旨在帮助企业管理、监控和保护其内部网络中的各种终端设备&#xff0c;如个人电脑、笔记本、移动设备等。 这类软件的主要功能包括但不限于以下几个方面&#xff1a; 1&#xff0c;实时监控&a…

快消终端门店真实性新玩法:全流程校验+多元认证多重保障

在某饮品企业会议室&#xff0c;气氛凝重。城市经理一脸严肃地扫视着团队成员&#xff0c;小李、小张和小陈等人在这锐利的目光下显得有些局促不安。 城市经理沉声开口&#xff1a;小李上报的“幸福超市”’新店在XX大街上并不存在。这是怎么回事&#xff1f; 小李支吾着回答…

为表格添加背景色:\rowcolor, \columncolor,\cellcolor

设置行的背景 \rowcolor 是 LaTeX 中用于设置表格行的背景色的命令。它可以使表格更加美观和易于阅读。rowcolor 命令通常与 colortbl 宏包一起使用。 语法如下&#xff1a; \rowcolor{<color>}其中 表示要设置的背景色&#xff0c;可以是预定义的颜色名称&#xff08…