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

2023环翠区编程挑战赛中学组题解

T1. 出栈序列

题目描述

栈是一种“先进后出”的数据结构,对于一个序列1,2,...,n1,2, ...,n1,2,...,n,其入栈顺序是1,2,...n1,2, ...n1,2,...n,但每个元素出栈的时机可以自由选择。

例如111入栈、111出栈,222入栈、333入栈、333出栈、222出栈,于是出栈序列为 1321\ 3\ 21 3 2

对于入栈顺序12...n1\ 2\ ...\ n1 2 ... n,出栈序列有很多个,但出栈序列的总数不是12...n1\ 2\ ...\ n1 2 ... n的全排列数,因为有些排列不满足出入栈规则。

例如3123\ 1\ 23 1 2就不是一个合法的出栈序列,因为333先出栈意味着此时111222在栈里面,入栈顺序是121\ 21 2,于是出栈必须是212\ 12 1

小明仔细研究了出入栈的规则,它发现凡是不合法的出栈序列都有一个规律,至少有一个数,后面比它小的数,存在递增的情况。

现在请你帮助小明编写程序,对于给定的出栈序列,判断是否合法。

输入格式:

第一行ttt,表示ttt组数据
对每组数据
第一行nnn,表示序列长度
第二行1..n1..n1..n的一个排列,表示要判断的出栈序列

输出格式:

ttt行,每行YesNo,表示出栈序列是否合法

输入样例1:

2
3
1 2 3
3
3 1 2

输出样例1:

Yes
No

数据范围

所有数据:t<=5t<=5t<=5
样例1-3:n<=100n<=100n<=100
样例4-5:n<=2000n<=2000n<=2000
样例6-10:n<=105n<=10^5n<=105

代码实现

#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N], stk[N], top;
int main()
{int t;scanf("%d", &t);while(t --){int n, x;scanf("%d", &n);int in = 1, out; //进栈in,出站outfor(int i = 1; i <= n; i ++) {scanf("%d", &out);while(in <= out) stk[top ++] = in ++; //将小于等当前入栈元素的所有数据入栈if(stk[top - 1] == out) { top --; } //检查栈顶元素是否为要出栈的数据else break;}if(top == 0) puts("Yes");else puts("No");}
}

领头牛

题目描述

在我国有一处牧场,里面养育着两种牛分别是HHH牛和GGG牛。为了方便实时管理我们需要在牛群中选出领头牛,这样我们只需要牵着领头牛其他牛自然就会跟着走。

现在我们要分别选出HHH领头牛和GGG领头牛凑成一对。

现在我们让牛群站成一排,例如: GHHGGHHGGHHG ,每头牛都有一个属性“领导能力”。假设第 111 头牛的领导能力为 222 ,那么他可以领导包含自身之后的两头牛也就是 “GHGHGH” 。

但是光有领导能力是不够做领头牛的,领头牛的要求满足两种要求之一:

  • 能够领导自身品种全部的牛;
  • 能够领导对方的领头牛。

我们会给出队伍顺序和每头牛的领导能力,请问有多少对领头牛?

输入格式

第一行输入 nnn 表示牛的数量;
第二行输入nnn个字符,有GGGHHH组成,表示牛的排列顺序;
第三行输入nnn个数,表示牛的领导能力。

输出格式:

输出一个整数nnn表示可以凑成几对领导牛。

输入样例1:

4
GHHG
2 2 1 1

输出样例1:

1

样例1说明:

第一头牛GGG,可以领导222头牛“GHGHGH”,没有包含全部的GGG牛,但是第二头牛HHH可以领导222头牛“HHHHHH”,包含了所有的HHH牛,所以第二头HHH牛是领头牛,那么第一头GGG牛包含了对方的领头牛,所以第一头GGG牛也是领头牛。
现在就是GGG有一头领头牛,HHH有一头领头牛,那么只能凑一对(1,2)(1,2)(12)

输入样例2:

3
GGH
2 2 1

输出样例2:

2

样例2说明:

第一头牛GGG,领导222头牛“GGGGGG”包含全部的GGG牛,所以是领头牛;
第二头牛GGG,领导222头牛“GHGHGH”包含对方领头牛,所以是领头牛;
第三头牛HHH,领导111头牛“HHH”包含全部H牛,所以是领头牛;
配对(1,3)(1,3)13(2,3)(2,3)23所以有222

数据范围:

对于20%的数据:1≤n≤201 ≤ n ≤ 201n20
对于40%的数据:1≤n≤1001 ≤ n ≤ 1001n100
对于60%的数据:1≤n≤50001 ≤ n ≤ 50001n5000
对于80%的数据:1≤n≤200001 ≤ n ≤ 200001n20000
对于100%的数据:1≤n≤1000001 ≤ n ≤ 1000001n100000。​​

代码实现(80分)

模拟,时间复杂度为O(n2)O(n^2)O(n2)

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 2e5 + 10;
char s[N];
int a[N], g[N], h[N];
int main()
{int n, x;cin >> n;cin >> s + 1;int s1 = 0, s2 = 0;for(int i = 1; i <= n; i ++){if(s[i] == 'G') s1 ++;else s2 ++;}for(int i = 1; i <= n; i ++) {cin >> x;a[i] = i + x - 1; //a[i]保存领导能力到达的位置}//处理第一种领导者:其记录的名单上包含它的品种的所有奶牛for(int i = 1; i <= n; i ++){int gg = 0, hh = 0;for(int j = i; j <= a[i]; j ++){if(s[j] == 'G') gg ++;else hh ++;}if(s[i] == 'G' && gg == s1) g[i] = 1; //标记为领导者else if(s[i] == 'H' && hh == s2) h[i] = 1; //标记为领导者}//处理第二种领导者:其记录的名单上记录了另一品种奶牛的“领导者”。for(int i = 1; i <= n; i ++){for(int j = i; j <= a[i]; j ++){if(s[i] == 'G' && h[j] == 1){g[i] = 1;break;}else if(s[i] == 'H' && g[j] == 1){h[i] = 1;break;}}}int c1 = 0, c2 = 0;for(int i = 1; i <= n; i ++)if(g[i]) c1 ++;for(int i = 1; i <= n; i ++)if(h[i]) c2 ++;cout << c1 * c2 << endl;
}

代码实现(100分)

朴素做法的问题在于使用了两层循环,其实第二层循环可以使用前缀和进行优化,用空间换时间。

  • s1[]前缀和数组,s1[i]表示前i个字符中字符G的个数
  • s2[]前缀和数组,s2[i]表示前i个字符中字符H的个数
  • gs[]前缀和数组,gs[i]表示前i头牛中第一类G品种领导者的数量
  • hs[]前缀和数组,hs[i]表示前i头牛中第一类H品种领导者的数量
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 2e5 + 10;
char s[N];
int a[N], s1[N], s2[N], g[N], h[N], gs[N], hs[N];
int main()
{int n;cin >> n;cin >> s + 1;for(int i = 1; i <= n; i ++) {cin >> x;a[i] = i + x - 1; //a[i]保存领导能力到达的位置}//s1[i]前缀和, 表示前i个字符中字符G的个数//s2[i]前缀和, 表示前i个字符中字符H的个数for(int i = 1; i <= n; i ++){s1[i] = s1[i - 1], s2[i] = s2[i - 1];if(s[i] == 'G') s1[i] ++;else s2[i] ++;}//处理第一种领导者:其记录的名单上包含本身的品种的所有奶牛for(int i = 1; i <= n; i ++){//gg表示从i到a[i]位置所有G的个数//hh表示从i到a[i]位置所有H的个数int gg = s1[a[i]] - s1[i - 1], hh = s2[a[i]] - s2[i - 1];//其记录的名单上包含本身的品种的所有奶牛if(s[i] == 'G' && gg == s1[n]) g[i] = 1; //将i位置标记为'G'的领导者else if(s[i] == 'H' && hh == s2[n]) h[i] = 1;//将i位置标记为'H'的领导者}//gs[i]前缀和,表示前i个奶牛中G的第一种领导者个数//hs[i]前缀和,表示前i个奶牛中H的第一种领导者个数for(int i = 1; i <= n; i ++){gs[i] = gs[i - 1], hs[i] = hs[i - 1];if(g[i]) gs[i] ++;if(h[i]) hs[i] ++;}//ga表示G的第一种领导者个数,ha表示H的第一种领导者个数int ga = gs[n], ha = hs[n];//处理第二种领导者:其记录的名单上记录了另一品种奶牛的“领导者”。for(int i = 1; i <= n; i ++){  //其记录的名单上记录了另一品种奶牛的领导者if(s[i] == 'G' && (hs[a[i]] - hs[i - 1]) != 0) ga ++;else if(s[i] == 'H' && (gs[a[i]] - gs[i - 1]) != 0) ha ++;}cout << ga * ha << endl;
}

两端对齐

题目描述

小明最近在用软件写文档时发现,在英文内容的键入时,软件会自动添加一些额外的空格到内容中,使得整段英文在文本区域的两端对齐,并且不会出现单个单词被拆分到两行的情况,看上去整齐又美观。

现在给定一篇文章中的nnn个单词,请试着将其按顺序以“两端对齐”的方式输出,要求:

  • 单词间至少由一个空格隔开,行末单词后无空格
  • 各行字符数均为mmm个,必要时可以在单词间补充额外的空格
  • 一行内单词间的空格数要尽量相同,若始终不能均匀分配,那么左侧的空格数可以多一些
  • 输出行数要尽可能少一些,也即每行放置的单词要尽可能多一些
    最后一行要左对齐,单词间不再插入额外的空格,末尾补空格至mmm个字符

输入格式:

第一行输入两个数nnnmmm
接下来nnn行,每行111个单词s​is_​isi​​ ,均由小写字母构成

输出格式:
输出排版后的文章(数据保证有解)

输入样例:

10 14
to
be
or
not
to
be
that
is
a
question

输出样例:

to  be  or not
to  be that is
a question

样例说明:

第1行在前两个单词后分别额外添加了一个空格;
第2行在第一个单词后额外添加了一个空格;
最后一行在末尾额外添加了4个空格。
各行均为141414个字符,输出的换行符不算入mmm

数据范围:

对于30%的数据:1≤n≤1001\le n \le1001n100
对于60%的数据:1≤n≤10001\le n \le10001n1000
对于100%的数据:1≤n≤1041\le n \le10^41n1041≤m≤1061\le m \le10^61m1061≤∣si∣≤1001\le|s_i|\le1001si100

代码实现(模拟?)

时间复杂度O(n2)O(n^2)O(n2)

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e4 + 10;
string a[N];
int main()
{int n, m;cin >> n >> m;for(int i = 0; i < n; i ++) cin >> a[i];string s = a[0]; //保存每行由单词和一个空格组成的字符串int cnt = 1; //每行单词的数量for(int i = 1; i < n; i ++){int len = s.size() + 1 + a[i].size(); //每行单词的长度if(len <= m) { s = s + ' ' + a[i]; cnt ++; }//每行字符串的长度不超过melse { //加入新单词后长度超过m            int b = m - s.size(); //需要填补空格int c = b / cnt; //平均每个单词需要额外添加的空格数量int r = b % cnt; //剩余需要在左侧补充的空格数量for(int j = i - cnt; j < i; j ++) // 输出单词{if(j != i - 1) cout << a[j] << " "; //不是本行最后一个单词,添加一个空格else cout << a[j]; //本行最后一个单词不添加空格for(int k = 0; k < c; k ++) cout << " "; //输出平均的空格if(r != 0) { //输出需要在做出补充的剩余空格,每个单词只补一个cout << " ";r --;}}cout << endl;s = a[i];cnt = 1;}}cout << s << endl; //输出最后一行的单词
}

T4. 免费超市

题解在我的另一篇博客,环翠区中小学生编程挑战赛题解中学组T4:免费超市

相关文章:

2023环翠区编程挑战赛中学组题解

T1. 出栈序列 题目描述 栈是一种“先进后出”的数据结构&#xff0c;对于一个序列1,2,...,n1,2, ...,n1,2,...,n&#xff0c;其入栈顺序是1,2,...n1,2, ...n1,2,...n&#xff0c;但每个元素出栈的时机可以自由选择。 例如111入栈、111出栈&#xff0c;222入栈、333入栈、333…...

手撸一个Switch开关组件

一、前言 手撸系列又来了&#xff0c;这次咱们来撸一个Switch开关组件&#xff0c;废话不多说&#xff0c;咱们立刻发车。 二、使用效果 三、实现分析 首先我们先不想它的这个交互效果&#xff0c;我们就实现“不合格”时的一个静态页面&#xff0c;静态页面大致如下&#x…...

2023年1月冰箱品牌销量排行:销量环比增长26%,销售额36亿+

鲸参谋电商大数据2023年1月京东平台“冰箱”销售数据出炉&#xff01; 根据鲸参谋平台电商数据显示&#xff0c;2023年1月份&#xff0c;在京东平台上&#xff0c;冰箱的销量将近130万件&#xff0c;环比增长26%&#xff0c;同比下滑8%&#xff1b;销售额达36亿&#xff0c;环比…...

DSP CCS 开发问题总结及解决办法

文章目录 问题汇总 1. CCS编译器的Project菜单栏工程导入选项丢失&#xff0c;怎么解决&#xff01; 1.1启动CCS后发现导入工程菜单栏丢失&#xff0c;无法导入工程文件。 1.2方法一 工程选项的导入工程文件丢失&#xff0c;如果要重新获得相应的选项&#xff0c;就需要删除当前…...

Vue3.x+Element Plus仿制Acro Design简洁模式分页器组件

Vue3.xElement Plus仿制Acro Design简洁模式分页器组件 开发中难免会遇到宽度很窄的列表需要使用分页器的情况&#xff0c;这时若使用Element Plus组件的分页器会导致分页器内容超出展示的区域&#xff0c;而Element Plus组件中目前没有Acro Design那样小巧的分页器&#xff08…...

经典文献阅读之--VoxelMap(体素激光里程计)

0. 简介 作为激光里程计&#xff0c;常用的方法一般是特征点法或者体素法&#xff0c;最近Mars实验室发表了一篇文章《Efficient and Probabilistic Adaptive Voxel Mapping for Accurate Online LiDAR Odometry》&#xff0c;同时还开源了代码在Github上。文中为雷达里程计提…...

.NET6中使用GRPC详细描述

Supported languages | gRPC&#xff0c;官网。至于原理就不说了&#xff0c;可以百度原理之后&#xff0c;然后再结合代码&#xff0c;事半功倍&#xff0c;就能很好理解GRPC了。 目录 一、简单使用 二、实际应用 一、简单使用 1.使用vs2022创建一个grpc程序&#xff0c;…...

ML@矩阵微积分基础

文章目录矩阵微积分Matrix calculus记法简单Jacobi Matrix分子记法分母记法一般形式的Jacobi MatrixTypes of matrix derivative向量求导向量对标量求导标量对向量求导向量对向量求导矩阵求导矩阵对标量求导(切矩阵)标量对矩阵求导记法向量求导 向量对标量求导标量对向量求导向…...

华为OD机试真题Python实现【优秀学员统计】真题+解题思路+代码(20222023)

优秀学员统计 题目 公司某部门软件教导团正在组织新员工每日打卡学习活动,他们开展这项学习活动已经一个月了,所以想统计下这个月优秀的打卡员工。每个员工会对应一个 id,每天的打卡记录记录当天打卡员工的 id 集合,一共 30 天。 请你实现代码帮助统计出打卡次数 top5 的…...

docsify在线文档支持pdf查看

目录 步骤一&#xff1a;添加插件 步骤二&#xff1a;添加pdf地址 步骤三&#xff1a;成果展示 docsify是一个在github上很好用的文档转换网页的工具&#xff0c;但是大部分情况我们都是使用的markdown文件。最近想把pdf文档也能支持在这上面展示&#xff0c;研究后总结一下…...

ES6中Set类型的基本使用

在ES6之前&#xff0c;存储数据的结构主要有两种&#xff1a;数组、对象。 在ES6中新增了另外两种数据结构&#xff08;存放数据的方式&#xff09;&#xff1a;Set、Map&#xff0c;以及他们的另外形式WeakSet、WeakMap。 Set的基本使用 Set是一个新增的数据结构&#xff0c…...

【VUE3.0_CSS功能】

CSS功能组件css作用域深度选择器&#xff08;标签名空格:deep(标签名)&#xff09;插槽选择器&#xff08;:soltted(标签名)&#xff09;全局选择器&#xff08;:global(类名)&#xff09;动态CSS&#xff08;v-bind&#xff09;useCSSModule拓展知识&#xff1a;deep的写法组件…...

微机原理复习总结6:汇编语言程序设计

本篇博客主要分享几道汇编语言例题编写一完整的程序&#xff0c;从键盘输入一组字符&#xff0c;直到输入“0”为止&#xff0c;当输入是小写字母时&#xff0c;则修改为大写字母&#xff0c;输入的字符存放在string为首址的存储单元中。data segment ;数据段定义 st…...

计算机网络 部分原理和过程

下面是一台计算机 Ping 和不在同一 IP 网络上的另一台计算机的全过程&#xff1a; 该计算机首先确定要 Ping 的目标 IP 地址&#xff0c;并检查该 IP 地址是否与本地 IP 地址在同一 IP 网络上。如果目标 IP 地址与本地 IP 地址不在同一 IP 网络上&#xff0c;则需要通过路由器…...

C++实现链表

C实现链表 众所周知&#xff0c;C/C语言实现的链表是由一个一个的结点构成&#xff0c;每个结点分为数据域和指针域&#xff0c;指针域中存储了其后继结点的地址&#xff0c;通过地址来访问下一个结点。 链表是一系列节点串联形成的数据结构&#xff0c;链表存储有序的元素集合…...

MySQL索引篇

文章目录说明&#xff1a;索引篇一、索引常见面试题按数据结构按物理存储分类按字段特性分类按字段个数分类索引缺点&#xff1a;什么时候适用索引&#xff1f;什么时候不需要创建索引&#xff1f;常见优化索引的方法&#xff1a;发生索引失效的情况&#xff1a;二、从数据页角…...

Ardiuno-交通灯

LED交通灯实验实验器件&#xff1a;■ 红色LED灯&#xff1a;1 个■ 黄色LED灯&#xff1a;1 个■ 绿色LED灯&#xff1a;1 个■ 220欧电阻&#xff1a;3 个■ 面包板&#xff1a;1 个■ 多彩杜邦线&#xff1a;若干实验连线1.将3个发光二极管插入面包板&#xff0c;2.用杜邦线…...

Leetcode.1234 替换子串得到平衡字符串

题目链接 Leetcode.1234 替换子串得到平衡字符串 Rating &#xff1a; 1878 题目描述 有一个只含有 Q, W, E, R四种字符&#xff0c;且长度为 n 的字符串。 假如在该字符串中&#xff0c;这四个字符都恰好出现 n/4次&#xff0c;那么它就是一个「平衡字符串」。 给你一个这样…...

聚类算法之K-means算法详解

文章目录 什么是聚类k-means算法简介牧师-村民模型算法步骤伪代码流程描述手动实现优缺点优点缺点算法调优与改进数据预处理合理选择 K 值手肘法Gap Statistic(间隔统计量)轮廓系数法(Silhouette Coefficient)Canopy算法拍脑袋法采用核函数K-means++ISODATA参考文献<...

电话呼入/呼出CSFB流程介绍

MO CSFB 注册的LAI跟SYS_INFO不同会触发LU流程;LU流程结束后,判断LOCATION UPDATING ACCEPT消息中的"Follow-on proceed"参数状态。(1)如果IE消息中有"Follow-on proceed",终端直接发送CM Service Request; (2)如果IE消息中没有"Follow-on procee…...

【比赛合集】9场可报名的「创新应用」、「程序设计」大奖赛,任君挑选!

CompHub 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号同时会推送最新的比赛消息&#xff0c;欢迎关注&#xff01;更多比赛信息见 CompHub主页 或 点击文末阅读原文以下信息仅供参考&#xff0c;以比赛官网为准目录创新应用赛&…...

剑指 Offer 27. 二叉树的镜像

剑指 Offer 27. 二叉树的镜像 难度&#xff1a;easy\color{Green}{easy}easy 题目描述 请完成一个函数&#xff0c;输入一个二叉树&#xff0c;该函数输出它的镜像。 例如输入&#xff1a; 镜像输出&#xff1a; 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,…...

RPC编程:RPC概述和架构演变

RPC编程系列文章第一篇一&#xff1a;引言1&#xff1a;本系列文章的目标2&#xff1a;RPC的概念二&#xff1a;架构的演变过程1&#xff1a;单体架构1)&#xff1a;概念2)&#xff1a;特点3)&#xff1a;优缺点2&#xff1a;单体架构水平扩展1)&#xff1a;水平拓展的含义2)&a…...

神经网络训练时只对指定的边更新参数

在神经网络中&#xff0c;通常采用反向传播算法来计算网络中各个参数的梯度&#xff0c;从而进行参数更新。在反向传播过程中&#xff0c;所有的参数都会被更新。因此&#xff0c;如果想要只更新指定的边&#xff0c;需要采用特殊的方法。 一种可能的方法是使用掩码&#xff0…...

Python列表list操作-遍历、查找、增加、删除、修改、排序

在使用列表的时候需要用到很多方法&#xff0c;例如遍历列表、查找元素、增加元素、删除元素、改变元素、插入元素、列表排序、逆序列表等操作。 1、遍历列表 遍历列表通常采用for循环的方式以及for循环和enumerate&#xff08;&#xff09;函数搭配的方式去实现。 1&#xff…...

Python开发-学生管理系统

文章目录1、需求分析2、系统设计3、系统开发必备4、主函数设计5、 学生信息维护模块设计6、 查询/统计模块设计7、排序模块设计8、 项目打包1、需求分析 学生管理系统应具备的功能&#xff1a; ●添加学生及成绩信息 ●将学生信息保存到文件中 ●修改和删除学生信息 ●查询学生…...

大数据处理 - Trie树/数据库/倒排索引

Trie树Trie树的介绍和实现请参考 树 - 前缀树(Trie)适用范围: 数据量大&#xff0c;重复多&#xff0c;但是数据种类小可以放入内存基本原理及要点: 实现方式&#xff0c;节点孩子的表示方式扩展: 压缩实现。一些适用场景&#xff1a;寻找热门查询: 查询串的重复度比较高&#…...

jjava企业级开发-01

一、Spring容器演示 采用Spring配置文件管理Bean 1、创建Maven项目 修改项目的Maven配置 2、添加Spring依赖 在Maven仓库里查找Spring框架&#xff08;https://mvnrepository.com&#xff09; 同上添加其他依赖 <?xml version"1.0" encoding"UTF-8…...

「事务一致性」事务afterCommit

在事务还没有执行完消息就已经发出去了, 导致后续的一些数据或逻辑上的问题产生。场景如下&#xff1a;异步-记录日志&#xff1a;当事务提交后&#xff0c;再记录日志。发送mq消息&#xff1a;只有业务数据都存入表后&#xff0c;再发mq消息。方案1. 利用TransactionSynchroni…...

【深度学习编译器系列】2. 深度学习编译器的通用设计架构

在【深度学习编译器系列】1. 为什么需要深度学习编译器&#xff1f;中我们了解到了为什么需要深度学习编译器&#xff0c;和什么是深度学习编译器&#xff0c;接下来我们把深度学习编译器这个小黑盒打开&#xff0c;看看里面有什么东西。 1. 深度学习编译器的通用设计架构 与…...