CodeTON Round #7 (Div. 1 + Div. 2)

A.jagged Swaps

题意:

给出一个包含 n n n个数字的序列,每次可以选择一个同时大于左右两边相邻的数字,将这个数字与它右边的数字交换,问能否在经过若干次操作后使序列变为升序。

分析:

由于交换只能向后进行,且第一个元素无法向后交换(不存在左边的数字),而其他大的数字均可以通过交换到达自己的位置,因此只需要考虑开始时序列的第一个数字是否为1,如果是1,就是"YES",否则,就是"NO"

hint:包含 n n n个数字的序列恰好包含 1 ∼ n 1 \sim n 1n中每一个数字。

代码:

#include <bits/stdc++.h>
using namespace std;int a[15];void solve() {int n;cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];}if (a[1] != 1) {cout << "NO" << endl;} else {cout << "YES" << endl;}
}int main() {int Case;cin >> Case;while (Case--) {solve();}return 0;
}

B.AB Flipping

题意:

给出一个长度为 n n n且仅包含"AB"两种字符的字符串,每次可以选择一个下标 i i i,当字符串中第 i i i个字符为'A',且第 i + 1 i + 1 i+1个字符为'B',那么可以让第 i i i个字符和第 i + 1 i + 1 i+1个字符交换。

要求每个下标 i i i均只能选择一次,问最多可以进行多少次交换。

分析:

当出现连续的'B'前面有一个'A'时,这段连续区间上的'B'均可以向前交换一次,交换次数为这段连续的'B'的长度,而经过一次交换之后,由于每个下标只能被选择一次,那么仅有第一个'B'还能向前交换,可以认为这段连续的'B'交换完成后就只剩下开头这一个'B'了。使用变量维护还能向前交换的'B'的个数,从后往前遍历模拟即可。

代码:

#include <bits/stdc++.h>
using namespace std;string s;void solve() {int n;cin >> n >> s;int cnt = 0, ans = 0;for (int i = n - 1; i >= 0; i--) {if (s[i] == 'B') {cnt++;} else {ans += cnt;cnt = min(cnt, 1);//如果当前没有遇到过B,就让cnt保持在0}}cout << ans << endl;
}int main() {solve();return 0;
}

C.Matching Arrays

题意:

给出两个包含 n n n个数字的数组 a a a b b b,这两个数组的美丽值为满足 a i > b i a_i > b_i ai>bi的下标 i i i的个数。

题目会给出一个数字 x x x,问能否对 b b b重新排列,使得这两个数组的美丽值等于 x x x

分析:

虽然题目要求只能对 b b b重排,但为了便于处理,两个数组都需要排序,同时为了记录数组 a a a原本的数字位置,需使用结构体存储数据。

贪心:将 a a a中最大的 x x x个元素与 b b b中最小的 x x x个元素按大小次序进行比较,如果这部分元素无法构成 x x x的美丽值,由于 a a a中剩余元素更小, b b b中剩余元素更大,那么无论怎么交换元素,都无法使美丽值增加,此时本题无解。

检查:比较完 a a a中最大的 x x x个元素与 b b b中最小的 x x x个元素后,还需要考虑剩余的元素是否还会产生美丽值,同样采用按大小次序依次比较,如果产生美丽值那么同样表示本题无解。

输出:如果可以构造,那么需要根据记录的 a a a中每个数字排序前的位置将对应的 b b b数组元素输出。

代码:

#include <bits/stdc++.h>
using namespace std;struct Node{int val, id;bool operator < (const Node &o) const {return val < o.val;}
}a[200005], b[200005];int ans[200005];void solve() {int n, x;cin >> n >> x;for (int i = 1; i <= n; i++) {cin >> a[i].val;a[i].id = i;}sort(a + 1, a + 1 + n);for (int i = 1; i <= n; i++) {cin >> b[i].val;b[i].id = i;}sort(b + 1, b + 1 + n);for (int i = 1; i <= x; i++) {if (a[i + n - x].val <= b[i].val) {//a中最大的x个与b中最小的x个对位比较cout << "NO" << endl;return;}ans[a[i + n - x].id] = b[i].val;//将当前b中元素放入对应的a中元素原本所在下标对应的位置上}for (int i = 1; i <= n - x; i++) {if (a[i].val > b[i + x].val) {//剩余的n-x个元素对位比较cout << "NO" << endl;return;}ans[a[i].id] = b[i + x].val;}cout << "YES" << endl;for (int i = 1; i <= n; i++) {cout << ans[i] << ' ';}cout << endl;
}int main() {int Case;cin >> Case;while (Case--) {solve();}return 0;
}

D.Ones and Twos

题意:

给出一个仅包含 1 , 2 1,2 1,2的数组。

q q q个询问,询问分以下两种情况:

  • "1 s",询问数组中能否找出一个子段和为 s s s

  • "2 i v",将数组中第 i i i个数字修改为 v v v

分析:

通过分析样例,可以发现以下规律:如果子段的左右端点数字均为1,那么可以组成任意值在 1 ∼ 1 \sim 1(子段数字之和)以内的数字。

根据以上规律,想要组成尽可能多的数字,那么选择的一定是最左和最右的两个 1 1 1中间的子段(包含端点)。

然后需要根据以下情况进行分类讨论:

  • 数组中存在 1 1 1,这两个 1 1 1之间的子段总和为 s u m sum sum

    • x ≤ s u m x \le sum xsum,则可以组成

    • x > s u m x \gt sum x>sum,分成以下两种情况:

      • x x x s u m sum sum奇偶性相同,为了尽可能使总和最大,一定会选择将选择的子段向左右扩散,且此时左右元素一定均为2,只要整个数组的数字总和可以达到 x x x,那么就能组成 x x x

      • 奇偶性不同时,可以删去子段一侧的 1 1 1,再加上另一侧的 2 2 2,看组成的子段数字总和能否到达 x x x

  • 数组中不存在 1 1 1,那么能组成的只有偶数,且能组成的偶数 x x x的值要在数组中数字总和的范围内。

hint:可以通过 s e t set set对所有 1 1 1所在的位置(下标)进行维护,通过 ∗ ( b e g i n ( ) ) *(begin()) (begin()) ∗ ( − − e n d ( ) ) *(--end()) (end())(end()函数返回的是最后一个元素的下一个迭代器,需要通过前自减得到最后一个元素的迭代器)来获得集合中最小和最大的元素。

代码:

#include <bits/stdc++.h>using namespace std;
int n, q, a[100005], cnt;set<int> S;bool check(int x) {if (S.empty()) {//数组中没有1if (x % 2 == 1) return false;if (n * 2 < x) return false;return true;}int first = *S.begin(), last = *(--S.end());//获得最前和最后的1所在的下标int sum = (last - first + 1) * 2 - S.size();//将区间内所有的数视为2,计算出总和,减去1的数量,就是该子段的数字总和if (sum >= x) return true;//被1包围的子段已经能组成x了if (x % 2 == sum % 2) {int add = n - (last - first + 1);//计算出未被加上的2的数量if (sum + add * 2 >= x) return true;} else {int add = max(n - last, first - 1);//计算左右两边最多有多少个2if (sum - 1 + add * 2 >= x) return true;}return false;
}void solve() {S.clear();cin >> n >> q;for (int i = 1; i <= n; i++) {cin >> a[i];if (a[i] == 1) {S.insert(i);cnt++;}}while (q--) {int op;cin >> op;if (op == 1) {int x;cin >> x;if (check(x)) {cout << "YES" << endl;} else {cout << "NO" << endl;}} else {int i, v;cin >> i >> v;if (a[i] == 1) S.erase(i);a[i] = v;if (a[i] == 1) S.insert(i);}}
}int main() {int Case;cin >> Case;while (Case--) {solve();}return 0;
}

E.Permutation Sorting

更新中…

以下学习交流QQ群,群号: 546235402,大家可以加群一起交流做题思路,分享做题技巧,欢迎大家的加入。

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

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

相关文章

Java 基础学习(四)操作数组、软件开发管理

1 操作数组 1.1.1 System.arraycopy 方法用于数组复制 当需要将一个数组的元素复制到另一个数组中时&#xff0c;可以使用System.arraycopy方法。它提供了一种高效的方式来复制数组的内容&#xff0c;避免了逐个元素赋值的繁琐过程。相对于使用循环逐个元素赋值的方式&#x…

C#-串口通信入门及进阶扩展

目录 一、串口相关参数介绍 1、端口&#xff08;COM口&#xff09; 2、波特率&#xff08;Baud rate&#xff09; 3、起始位 4、停止位&#xff08;StopBits&#xff09; 5、数据位 6、校验位 7、缓存区 二、串口通信助手 三、虚拟串口工具 四、进阶扩展 1、位运算…

InnoDB存储引擎中的锁

文章目录 概要一、需要解决的问题二、共享锁和独占锁1.1 锁定读1.2 表级别的共享锁、独占锁 三、行锁3.1 数据准备3.2 几种常见的行级锁3.3 行锁升级为表锁 概要 关于MySQL涉及到的锁&#xff0c;大致可以总结如下&#xff1a; MyISAM存储引擎在开发过程中几乎很少使用了&…

SpringSecurity+JWT实现权限控制以及安全认证

一.简介 Spring Security 是 Spring家族中的一个安全管理框架。相比与另外一个安全框架Shiro&#xff0c;它提供了更丰富的功能&#xff0c;社区资源也比Shiro丰富。 认证&#xff1a;验证当前访问系统的是不是本系统的用户&#xff0c;并且要确认具体是哪个用户​ 授权&…

Spring Boot + MyBatis-Plus实现数据库读写分离

文章目录 1. 引言2. MyBatis-Plus简介3. 准备工作4. 配置数据源5. 配置MyBatis-Plus6. 创建实体类和Mapper接口7. 编写Service8. 控制器层9. 测试10. 数据库读写分离的原理11. 拓展11.1. 动态数据源11.2. 多数据源事务管理11.3. 多租户支持 12. 总结 &#x1f389;Spring Boot …

【多线程】-- 06 线程状态之线程停止与休眠

多线程 5 线程状态 线程的五大状态&#xff1a;创建状态、就绪状态、阻塞状态、运行状态、死亡状态。如下图所示&#xff1a; 具体解释如下&#xff1a; 线程方法&#xff1a; 5.1 停止线程 不推荐使用JDK提供的stop()方法、destroy()方法【已废弃 – deprecated】推荐线程自…

NX二次开发UF_CSYS_create_csys 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_create_csys Defined in: uf_csys.h int UF_CSYS_create_csys(const double csys_origin [ 3 ] , tag_t matrix_id, tag_t * csys_id ) overview 概述 Creates a CSYS. 创…

京东API接口的接入(京东工业)

在技术交流群&#xff0c;大家有探讨稳定获取京东商品主图、价格、标题&#xff0c;及sku的完整解决方案。这个引起了我技术挑战的兴趣。 目前&#xff0c;自己做了压测&#xff0c;QPS高、出滑块概率极低&#xff0c;API整体稳定&#xff0c;可满足业务场景的性能需求。 公共…

Appium PO模式UI自动化测试框架——设计与实践

1. 目的 相信做过测试的同学都听说过自动化测试&#xff0c;而UI自动化无论何时对测试来说都是比较吸引人的存在。相较于接口自动化来说&#xff0c;它可以最大程度的模拟真实用户的日常操作与特定业务场景的模拟&#xff0c;那么存在即合理&#xff0c;自动化UI测试自然也是广…

面试题:海量PDF的OCR处理思路

关键点&#xff1a; 1000wPDF&#xff1a;数据量非常大。3天处理完&#xff1a;有时间限制。一篇PDF1~10s&#xff1a;可能需要以最高10s去做计算&#xff0c;这样时间才能保证留有富余。要求资源最大化利用&#xff1a;也就是尽可能节省服务器资源&#xff0c;能复用尽量复用&…

【EI会议征稿】第四届应用数学、建模与智能计算国际学术会议(CAMMIC 2024)

第四届应用数学、建模与智能计算国际学术会议&#xff08;CAMMIC 2024&#xff09; 2024 4th International Conference on Applied Mathematics, Modelling and Intelligent Computing 第四届应用数学、建模与智能计算国际学术会议&#xff08;CAMMIC 2024&#xff09;将于…

JOSEF约瑟 逆功率继电器 GG-21 5a 100v 50hz

系列型号 GG-21逆功率继电器 GG-22过载继电器 1 用途 逆功率继电器GG-21/5A/100V 在出现逆功率时&#xff0c;从电网中断开交流发电机。 2 概述 逆功率继电器是基于感应式原理(具有旋转磁场)而工作。 继电器导磁体由两个磁路系统组成&#xff1a;上磁路系统和下磁路系统…

【带头学C++】----- 八、C++面向对象编程 ---- 8.10 函数的默认参数

8.10 函数的默认参数 C在声明函数原型的时可为一个或者多个参数指定默认(缺省)的参数值&#xff0c;当函数调用的时候如果没有指定这个值&#xff0c;编器会自动用默认值代替。 通过为函数参数指定默认值&#xff0c;可以在调用函数时省略相应的参数&#xff0c;而该参数将使用…

陶陶摘苹果、跳跃游戏

1. 陶陶摘苹果 题目描述&#xff1a; 陶陶家的院子里有一棵苹果树&#xff0c;每到秋天树上就会结出 10 个苹果。苹果成熟的时候&#xff0c;陶陶就会跑去摘苹果。陶陶有个 30 厘米高的板凳&#xff0c;当她不能直接用手摘到苹果的时候&#xff0c;就会踩到板凳上再试试。 现在…

【MySQL源码】使用CLion 远程调试MySQL源码

目录 0 准备工作 1 IDE 2 下载MySQL源码 ​编辑 一 配置CLion 1 添加远程服务器 2 配置远程服务器环境 3 升级gdb版本 4 升级CMake版本 5 修改远程服务器文件上传的目录的对应关系 5 配置cmake 7 初始化MySQL 8 启动MySQL 作为DBA工作多年&#xff0c;如果还是停…

48个代码大模型汇总,涵盖原始、改进、专用、微调4大类

代码大模型具有强大的表达能力和复杂性&#xff0c;可以处理各种自然语言任务&#xff0c;包括文本分类、问答、对话等。这些模型通常基于深度学习架构&#xff0c;如Transformer&#xff0c;并使用预训练目标&#xff08;如语言建模&#xff09;进行训练。 在对大量代码数据的…

Leetcode(面试题 08.01.)三步问题

文章目录 前言一、题目分析二、算法原理1.状态表示2.状态转移方程3.初始化4.填表顺序5.返回值是什么 三、代码实现总结 前言 在本文章中&#xff0c;我们将要详细介绍一下Leetcode(面试题 08.01.)三步问题相关的内容 一、题目分析 1.小孩可以上一阶&#xff0c;两阶&#xff…

Shell脚本编程案例 – 批量创建特殊要求账户

Shell脚本编程案例 – 批量创建特殊要求账户 Shell Scripting Cases – Create a Bunch of accounts with special requests By JacksonML 本文简要介绍批量执行Shell脚本命令的基本思路&#xff0c;以检验shell脚本知识掌握情况。希望对读者有所帮助。 案例要求&#xff1a…

GO 集成Prometheus

一、Prometheus介绍 Prometheus&#xff08;普罗米修斯&#xff09;是一套开源的监控&报警&时间序列数据库的组合&#xff0c;起始是由SoundCloud公司开发的。随着发展&#xff0c;越来越多公司和组织接受采用Prometheus&#xff0c;社会也十分活跃&#xff0c;他们便…

初刷leetcode题目(10)——数据结构与算法

&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️…