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

news/2024/9/19 11:06:00/

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:免费超市


http://www.ppmy.cn/news/26774.html

相关文章

基于UIAutomation+Python+Unittest+Beautifulreport的WindowsGUI自动化测试框架common目录解析

文章目录1 框架工具说明2 技术栈说明3 框架截图4 源码解析/common目录4.1 common/baseinfo.py4.2 common/creenShot.py4.3 common/logOut.py4.4 common/reportOut.py4.5 common/sendMail.py注&#xff1a; 1、本文为本站首发&#xff0c;他用请联系作者并注明出处&#xff0c;谢…

Spring基础总结(中)

13. 实现 AOP 的方式 通过 ProxyFactory 实现&#xff0c;注意这和 Proxy 不同&#xff0c;如下的 User 类不需要实现接口 ProxyFactory proxyFactory new ProxyFactory(); proxyFactory.setTarget(new CService());proxyFactory.addAdvice(new MethodInterceptor() {public…

深度学习在视频多目标跟踪中的应用综述

文章目录摘要1、简介2、MOT:算法、指标和数据集2.1、MOT算法简介2.2、指标经典的指标完整的MOT指标ID 分数2.3、基准数据集3、MOT中的深度学习3.1、深度学习中的检测步骤3.1.1、Faster R-CNN3.1.2、SSD3.1.3、Other detectors3.1.4、cnn在检测步骤中的其他用途3.2、深度学习在特…

【MySQL】MySQL表的增删改查(进阶)

✨个人主页&#xff1a;bit me&#x1f447; ✨当前专栏&#xff1a;MySQL数据库&#x1f447; ✨算法专栏&#xff1a;算法基础&#x1f447; ✨每日一语&#xff1a;悟已往之不谏&#xff0c;知来者之可追。实迷途其未远&#xff0c;觉今是而昨非。 目 录&#x1f384;一. 数…

七大排序经典排序算法

吾日三省吾身&#xff1a;高否&#xff1f;富否&#xff1f;帅否&#xff1f;答曰&#xff1a;否。滚去学习!!!(看完这篇文章先)目前只有C和C的功底&#xff0c;暂时还未开启新语言的学习&#xff0c;但是大同小异&#xff0c;语法都差不多。目录&#xff1a;一.排序定义二.排序…

查询服务器tns文件路径,oracle数据库tns配置方法详解

查询服务器tns文件路径,oracle数据库tns配置方法详解 TNS简要介绍与应用 Oracle中TNS的完整定义&#xff1a;transparence Network Substrate透明网络底层&#xff0c; 监听服务是它重要的一部分&#xff0c;不是全部&#xff0c;不要把TNS当作只是监听器。 TNS是Oracle Net…

【单目标优化算法】烟花优化算法(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…

如何锁定Word文档部分文字不被修改

我们知道&#xff0c;想要保护Word文档的内容无法随意更改&#xff0c;可以设置“限制编辑”的保护模式。 那如果实际工作中&#xff0c;只需要固定的一部分内容不能编辑&#xff0c;可以实现吗&#xff1f;答案是肯定的&#xff0c;今天就来说说如何设置Word文档部分文字可修…

VS Code Spring 全新功能来了!

大家好&#xff0c;欢迎来到我们 2023 年的第一篇博客&#xff01;我们想与您分享几个与 Spring 插件、代码编辑和性能相关的激动人心的更新&#xff0c;让我们开始吧&#xff01; Spring 插件包的新入门演练 演练&#xff08;Walkthrough&#xff09; 是一种多步骤、向导式的体…

【软件测试】自动化测试该如何做?项目?技术团队?你真的会自动化吗......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 对于自动化测试&…

接入网关和隔离网关

文章目录1. 什么是网关&#xff1f;2. 网关的作用是什么&#xff1f;3. 接入网关和隔离网关1. 什么是网关&#xff1f; 网关&#xff08;Gateway&#xff09;是一种网络设备&#xff0c;通常用于将不同网络之间的流量进行转发和路由&#xff0c;将一个网络连接到另一个网络&…

第十三届蓝桥杯省赛 C++ A 组 F 题、Java A 组 G题、C组 H 题、Python C 组 I 题——青蛙过河(AC)

目录1.青蛙过河1.题目描述2.输入格式3.输出格式4.样例输入5.样例输出6.数据范围7.原题链接2.解题思路Ac_code1.C2.Java1.青蛙过河 1.题目描述 小青蛙住在一条河边, 它想到河对岸的学校去学习。小青蛙打算经过河里 的石头跳到对岸。 河里的石头排成了一条直线, 小青蛙每次跳跃…

双因素方差分析

一、案例与数据 一家大型商业银行在多地区设有分行&#xff0c;其业务主要是进行基础设施建设&#xff0c;国家重点项目建设&#xff0c;固定资产投资等项目的贷款。近年来&#xff0c;该银行的贷款额平稳增长&#xff0c;但不良贷款额也有较大比例的提高&#xff0c;这给银行…

C语言实现动态管理通讯录信息系统(静态通讯录plus版)

文章目录前言&#xff1a;一.动态管理思想1.通讯录结构体声明发生变化2.通讯录结构体初始化发生变化3.通讯录能够动态增容4.通讯录销毁数据二.优化通讯录可持续读写信息1.保存通讯录中的信息到文件中2.加载文件信息到通讯录中三.源码1.text.c2.contact.c3.contact.h前言&#x…

数据结构与算法系列之kmp算法

什么是kmp算法 1.kmp算法是一种改进的字符串算法&#xff0c;其核心是利用匹配失败后的信息&#xff0c;尽量减少模式串与主串的匹配次数已达到快速匹配的目的。 它主要实现作用的是 在 &#xff08;主串&#xff09;中找到 &#xff08;匹配&#xff09;字符串。 例 BF算法与k…

华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】

使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12201821.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 分糖果 小明从糖果…

HTTP安全与HTTPS协议

目录 Http协议的安全问题 常见的加密方式 防止窃听 单向散列函数 单向散列值的特点 加密与解密 对称加密与非对称加密 对称加密的密钥配送问题 密钥配送问题的解决 非对称加密 前言&#xff1a; 公钥与私钥 非对称加密过程 混合密码系统 前言&#xff1a; 混合…

各类热门免费API合集

1、数据智能 身份证识别OCR&#xff1a;传入身份证照片&#xff0c;识别照片文字信息并返回&#xff0c;包括姓名、身份证号码、性别、民族、出生年月日、地址、签发机关及有效期。 通用文字识别OCR&#xff1a;多场景、多语种、高精度的整图文字检测和识别服务&#xff0c;多…

万物皆可集成资源包!低代码集成系列一网打尽

如何花最短的时间、用最少的成本解决客户的企业级应用定制问题&#xff1f; 如何满足数据库集成、Web API集成、第三方软件集成等需求&#xff0c;在如今万物皆可盘的当下&#xff0c;低代码如何用积木大玩具的方式快速构建各种应用&#xff0c;实现“万物皆可集成”&#xff…

react源码中的fiber架构

先看一下FiberNode在源码中的样子 FiberNode // packages/react-reconciler/src/ReactFiber.old.js function FiberNode(tag: WorkTag, pendingProps: mixed, key: null | string, mode: TypeOfMode, ) {// Instancethis.tag tag;this.key key;this.elementType null;t…