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,一经查实,立即删除!

相关文章

常用的操作数组的方法

1、concat() 链接两个数组 let arr1 [1,2,3] let arr2 [4,5] console.log(arr1.concat(arr2)) // [1,2,3,4,5] 2、join() 把数组转换成字符串,括号里的参数为分隔符&#xff0c;为空默认 ‘&#xff0c;’ let arr [1,2,3] console.log(arr.join()) //1,2,3 3、push() 向…

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. 创…

el-select多选下拉框实现全选功能

<el-selectv-model"query.web_ids"multiplecollapse-tagscollapse-tags-tooltip:max-collapse-tags"2"filterableplaceholder"网站"><li class"checkAllBox" style"padding: 0 32px 0 20px; border-bottom: 1px solid #…

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

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

Unity接入Protobuf介绍

Protobuf介绍 Protobuf&#xff08;Protocol Buffers&#xff0c;简称Proto&#xff09;是一种轻量级和高效率的数据序列化格式&#xff0c;由Google公司开发。与XML和JSON等文本格式不同&#xff0c;Protobuf是一种二进制格式&#xff0c;它具有更小的体积和更快的速度。在大…

std::shared_ptr 和多态的组合使用//test ok

在 C 中&#xff0c;std::shared_ptr 和多态&#xff08;通过虚函数和基类指针/引用实现&#xff09;可以很好地结合使用。这种组合通常用于管理对象的生命周期&#xff0c;同时允许通过基类指针或引用来实现多态。 下面是一个简单的示例&#xff0c;演示如何使用 std::shared…

多传感器融合SLAM论文调研

感知任务 物体识别&#xff1a; 《Pointnet: Deep learning on point sets for 3d classification and segmentation》《Voxelnet: End-to-end learning for point cloud based 3d object detection》 语义分割&#xff1a; 《An integrated framework for autonomous driv…

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;上磁路系统和下磁路系统…

FreeRTOS-事件组

目录 事件组 创建事件组 删除事件组 设置事件 等待事件 同步点 应用场景&#xff1a;等待多个事件 应用场景&#xff1a;任务同步 事件组 事件组可看成一个整形数&#xff0c;每一位代表一个事件。 每一位事件的含义由程序员决定&#xff0c;如位0表示串口是否就绪&…

快速掌握Pyqt5的9种显示控件

Pyqt5相关文章: 快速掌握Pyqt5的三种主窗口 快速掌握Pyqt5的2种弹簧 快速掌握Pyqt5的5种布局 快速弄懂Pyqt5的5种项目视图&#xff08;Item View&#xff09; 快速弄懂Pyqt5的4种项目部件&#xff08;Item Widget&#xff09; 快速掌握Pyqt5的6种按钮 快速掌握Pyqt5的10种容器&…

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

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