2024牛客寒假算法基础集训营3

前言

感觉有些题是有难度,但是是我花时间想能想的出来的题目,总体来说做的很爽,题目也不错。个人总结了几个做题技巧,也算是提醒自己。

1.多分类讨论

2.从特殊到一般,便于找规律。例如有一组数,有奇数和偶数,那我们可以构造一组数据全是偶数,观察其规律,然后插入一个奇数,再观察其规律。

3.很多编程题都涉及到数学知识,可以根据题意列出公式,然后试着把这个公式变形,没准有惊喜。

简单题

智乃与瞩目狸猫、幸运水母、月宫龙虾

签到题 

void solve() {string s1, s2; cin >> s1 >> s2;int span = 'A' - 'a';if (s1[0] >= 'a' && s1[0] <= 'z') s1[0] += span;if (s2[0] >= 'a' && s2[0] <= 'z') s2[0] += span;if (s1[0] == s2[0]) cout << "Yes" << endl;else cout << "No" << endl;
}

智乃的36倍数(easy version)

数据量这么小,暴力就完事。用上atol和c_str函数就行 

string s[N];
void solve() {int n; cin >> n;rep(i, 1, n) cin >> s[i];int ans = 0;rep(i, 1, n) {rep(j, i + 1, n) {string t1 = s[i] + s[j];string t2 = s[j] + s[i];int k1 = atol(t1.c_str());int k2 = atol(t2.c_str());if (k1 % 36 == 0)ans++;if (k2 % 36 == 0)ans++;}}cout << ans << endl;
}

chino's bubble sort and maximum subarray sum(easy version)

做的时候没看清题目,没关注到k只能是0和1,搞得我想了半天觉得好难,发现了之后就简单多了。

最关键的是怎么球最大字段和,这个一下子就能想到是dp,很经典的题目了。

int a[N], dp[1005];
int n, k;
int ans = -inf;
void check() {//找到最大子段和for (int i = 1; i <= n; i++) {dp[i] = max(dp[i - 1] + a[i], a[i]);ans = max(ans, dp[i]);}}void solve() {cin >> n >> k;rep(i, 1, n) cin >> a[i];if (k == 0) check();else {for (int i = 1; i < n; i++) {swap(a[i], a[i + 1]);check();swap(a[i], a[i + 1]);}}cout << ans << endl;
}

中等题

智乃的数字手串

妥妥的诈骗题!!!我总结了以往的诈骗题规律,诈骗题一般都是博弈论(贪心),然后要你输出yes或no,或者让你输出哪个人赢,这种诈骗题代码简单到超乎想象,而且经常是跟判断奇偶性有关。所以我们可以直接去猜答案。

正经分析

首先,偶 = 偶 + 偶 = 奇 + 奇;奇 + 偶 != 偶。

总结一下胜利的条件:(1)拿走最后一个,让对方没得拿  (2)通过交换的操作,使剩下的数没办法拿

什么情况下我们可以通过(1)胜利呢?不好分析,所以先分析(2)。

发现当我们交换成 “奇 偶 奇 偶 ... 偶”或者 “偶 奇 偶 奇 偶 ... 奇” 时我们就通过(2)胜利了。

而可以观察到这两种情况n都是偶数,易证当n是奇数时,一定是有数字可以拿的,当n是偶数的时候不一定有数字可以拿(注意是不一定)。

那么当n为奇数时,qcjj拿走一个数。此时n-1是偶数,我们就假设zn有数字可以拿。此时n-2是奇数,qcjj一定有数字可以拿。以此类推。

易证,当n为奇数qcjj始终有数字可以拿,而且qcjj是拿走最后一个数字的人,必赢。

反之亦然,n为偶数zn必赢。

#include <iostream>
using namespace std;//诈骗题
int main()
{    int T;cin>>T;while (T--){int n;int x;cin>>n;for (int i=1;i<=n;++i)cin>>x;if (n&1)cout<<"qcjj"<<'\n';elsecout<<"zn"<<'\n';}return 0;
}

智乃的比较函数

这题我本来想放在简单题那里的,因为真的好简单,居然才六百多个人做出来有点惊讶。下面代码可以通过normal version。

思路:直接三重循环枚举a1,a2,a3所有的情况。为什么能枚举呢,因为这三个数具体大小根本不重要,可以任意取,只要能体现他们之间大小关系的所有情况就行了,例如a1>a2>a3,a1=a2>a3等等所有情况。

然后用每种情况去测试n组cmp有没有矛盾,只要有一种情况没有矛盾就是yes。

struct Node {int x, y, z;
}node[N];
int n;
int a[10];
bool check() {rep(i, 1, n) {if (a[node[i].x] < a[node[i].y] && node[i].z == 0) {return false;}if (a[node[i].x] >= a[node[i].y] && node[i].z == 1) {return false;}}return true;
}
void solve() {cin >> n;rep(i, 1, n) {cin >> node[i].x >> node[i].y >> node[i].z;}int f = 0;rep(i, 1, 3) {//a1rep(j, 1, 3) {//a2rep(k, 1, 3) {//a3a[1] = i; a[2] = j; a[3] = k;if (check()) {f = 1;}}}}if (f) cout << "Yes" << endl;else cout << "No" << endl;}

难题

智乃的“黑红树”

个人认为这题比 智乃的36倍数(normal version) 简单,因为这题就是一个模拟建树,自己举出几个样例找找规律还是比较容易的,就是细节会多一点,但下一题考察思维不太容易想到。

分析:

1.是否能建树?

我们可以注意到题中说“如果有子节点,那么一定同时存在两个子节点”,说明要么左孩子右孩子都有,要么没有孩子。根结点是黑色的,因此如果可以建树,黑色结点数一定奇数,红色结点数一定是偶数。但这显然还不够严谨,因为如果有1个黑色结点,100个红色结点,也没法建树。经过简单思考易证b >= r / 2 && b <= 1 + 2 * r才可以建树。如下

if (b % 2 == 1 && r % 2 == 0 && b >= r / 2 && b <= 1 + 2 * r) cout<<"Yes"<<endl;
else cout<<"No"<<endl;

2.怎么建树?

按照“完全二叉树”的结构来建树。这样的好处是每个孩子的序号都是从小到大,如果一个根结点有孩子的话,就从小到大输出就行,如果没有就输出-1。

而且孩子的序号也可以确定,因为 lchild = 2*root,rchild = lchild + 1。假如lchild>n或者当前的红/黑结点不够放了,那么root就是没有孩子的。

void solve() {int r, b; cin >> b >> r;int n = r + b;if (b % 2 == 1 && r % 2 == 0 && b >= r / 2 && b <= 1 + 2 * r) {b--;int f = 0;int cur;int level = 1;for (int i = 1; i <= n; i++) {//level为奇数是在为黑层分配红孩子int lc = i * 2, rc = lc + 1;if ((r == 0 || b == 0) && !f) {f = 1;cur = lc;}if (f) {if (cur > n) cout << -1 << " -1" << endl;else if (level % 2 && r == 0) cout << "-1 -1" << endl;//当前在放置红结点,但是红结点没有了else if (level % 2 == 0 && b == 0) cout << "-1 -1" << endl;//跟上面同理else {cout << cur; cur++;cout << " " << cur << endl; cur++;}}else {//红黑结点数都 > 0cout << lc << " " << rc << endl;if (level % 2) r -= 2;else b -= 2;}if (i == pow(2, level) - 1) level++;}}else {cout << "No" << endl;}}

另一种更简单的做法,利用队列。

因为我们要按“完全二叉树”的模式建树,也就是从上到下,从左往右建树。这个可以想到遍历二叉树,用的是队列

void solve() {int b, r; cin >> b >> r;queue<int> q;//1代表黑,0代表红q.push(1);if (b % 2 == 1 && r % 2 == 0 && b >= r / 2 && b <= 1 + 2 * r) {cout << "Yes" << endl;b--;int cur = 2;while (!q.empty()) {int t = q.front(); q.pop();if (t == 1) {//要给它红孩子if (r == 0) cout << "-1 -1" << endl;else {cout << cur; cur++;cout << " " << cur << endl; cur++;q.push(0);q.push(0);r -= 2;}}else {if (b == 0) cout << "-1 -1" << endl;else {cout << cur; cur++;cout << " " << cur << endl; cur++;q.push(1);q.push(1);b -= 2;}}}}else cout << "No" << endl;}

 智乃的36倍数(normal version)

分析:看到题目的时候想,36的倍数都有什么特点,因为之前做过一道题好像也是关于什么的倍数,是有规律可循的,但在这题不行,要另找思路。

这题的正确思路是列出式子,然后变形,涉及到模运算的变换公式-CSDN博客。

对于(ai,aj)组成的数,若是36的倍数,列出

(ai*10^{k} + aj) %36 = 0,k是aj的位数

[(ai*10^{k})%36 + aj%36] % 36 = 0

[ [(ai%36)*(10^{k}%36)] % 36 + aj%36 ] %36 = 0

从1-n枚举每一个数当aj,去查询有没有 ai 满足 [(ai%36)*(10^{k}%36)] % 36 = 36 - aj%36。

事先用哈希表存每个数%36的结果,这样查询的时候就从哈希表的1-35找

总的时间复杂度是O(n)

//0是任何数的倍数
string s[N];
int a[N], b[37];
void solve() {int n; cin >> n;rep(i, 1, n) {cin >> s[i];a[i] = atol(s[i].c_str());b[a[i] % 36]++;}int ans = 0;rep(j, 1, n) {int k = s[j].size();int pj = a[j] % 36;int key = (36 - pj) % 36;int tpm = (int)pow(10, k) % 36;//ten_pow_modfor (int i = 0; i <= 35; i++) {if ((i * tpm) % 36 == key) {ans += b[i];if (pj == i) ans--;}}}cout << ans << endl;
}

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

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

相关文章

naiveui 上传图片遇到的坑 Upload

我在开发图片上传功能, 需要手动触发上传 但是我调用它内部自定义submit方法, 结果接口一直在报错400 我反反复复的测试了好就, 确定了就是我前端的问题,因为之前一直在做后端的错误排查, 以为是编译问题(因为之前也出现过这个问题) 好 , 我把其中一个参数类型改为String类型, …

Oracle Vagrant Box 扩展根文件系统

需求 默认的Oracle Database 19c Vagrant Box的磁盘为34GB。 最近在做数据库升级实验&#xff0c;加之导入AWR dump数据&#xff0c;导致空间不够。 因此需要对磁盘进行扩容。 扩容方法1&#xff1a;预先扩容 此方法参考文档Vagrant, how to specify the disk size?。 指…

2-8 单链表+双链表+模拟栈+模拟队列

今天给大家用数组来实现链表栈和队列 单链表&#xff1a; 首先要明白是如何用数组实现&#xff0c; 在这里需要用到几个数组&#xff0c;head表示头节点的下标&#xff0c;e[i]表示表示下标为i的值&#xff0c;ne[i]表示当前节点下一个节点的下标。idx表示当前已经用到那个点…

微信小程序(四十)API的封装与调用

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.在单独的js文件中写js接口 2.以注册为全局wx的方式调用接口 源码&#xff1a; utils/testAPI.js const testAPI{/*** * param {*} title */simpleToast(title提示){//可传参&#xff0c;默认为‘提示’wx.sho…

七月论文审稿GPT第2.5和第3版:分别微调GPT3.5、Llama2 13B以扩大对GPT4的优势

前言 自去年7月份我带队成立大模型项目团队以来&#xff0c;我司至今已有5个项目组&#xff0c;其中 第一个项目组的AIGC模特生成系统已经上线在七月官网第二项目组的论文审稿GPT则将在今年3 4月份对外上线发布第三项目组的RAG知识库问答第1版则在春节之前已就绪至于第四、第…

算法学习——LeetCode力扣二叉树篇3

算法学习——LeetCode力扣二叉树篇3 116. 填充每个节点的下一个右侧节点指针 116. 填充每个节点的下一个右侧节点指针 - 力扣&#xff08;LeetCode&#xff09; 描述 给定一个 完美二叉树 &#xff0c;其所有叶子节点都在同一层&#xff0c;每个父节点都有两个子节点。二叉树…

部署一个在线OCR工具

效果 安装 1.拉取镜像 # 从 dockerhub pull docker pull mmmz/trwebocr:latest 2.运行容器 # 运行镜像 docker run -itd --rm -p 10058:8089 --name trwebocr mmmz/trwebocr:latest 使用 打开浏览器输入 http://192.168.168.110:10058/ 愉快滴使用吧

Caché 为什么在医疗系统中吐槽

目前所知的 Cach 是应用在医院信息系统&#xff08;即 HIS&#xff09;&#xff0c;据说在欧美医疗卫生行业&#xff0c;Cach 占了 70% 的市场份额。国内的东华软件就是采用 Cach 数据库&#xff0c;东华软件在国内医院市场占有率大致为 20%&#xff0c;其中包括北京协和医院、…

【计算机网络】时延,丢包,吞吐量(分组交换网络

时延 结点处理时延(nodal processing delay&#xff09; dproc 排队时延&#xff08;queuing delay&#xff09; dqueue 传输时延&#xff08;transmission delay&#xff09; dtrans 路由器将分组推出所需要的时间&#xff0c;是分组长度和链路传输速率的函数 传播时…

新年加载中特效 —— 后期需要添加备注和消化

代码来源&#xff1a;链接: https://www.bilibili.com/video/BV1qA4m1573V/?spm_id_from333.880.my_history.page.click&vd_sourceb91967c499b23106586d7aa35af46413 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8&…

每日五道java面试题之java基础篇(三)

第一题. switch 是否能作⽤在 byte/long/String 上&#xff1f; Java5 以前 switch(expr)中&#xff0c;expr 只能是 byte、short、char、int。从 Java 5 开始&#xff0c;Java 中引⼊了枚举类型&#xff0c; expr 也可以是 enum 类型。从 Java 7 开始&#xff0c;expr 还可以…

Windows10安装PCL1.14.0及点云配准

一、下载visual studio2022 下载网址&#xff1a;Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器 (microsoft.com) 安装的时候选择"使用C的桌面开发“&#xff0c;同时可以修改文件路径&#xff0c;可以放在D盘。修改文件路径的时候&#xff0c;共享组件、…

Python进阶--爬取美女图片壁纸(基于回车桌面网的爬虫程序)

目录 一、前言 二、爬取下载美女图片 1、抓包分析 a、分析页面 b、明确需求 c、抓包搜寻 d、总结特点 2、编写爬虫代码 a、获取图片页网页源代码 b、提取所有图片的链接和标题 c、下载并保存这组图片 d、 爬取目录页的各种类型美女图片的链接 e、实现翻页 三、各…

【十四】【C++】list 的常见用法

list 的初始化和遍历 /*list的初始化和遍历*/ #if 1 #include <list> #include <vector> #include <iostream> #include<algorithm> using namespace std;void TestList1(){list<int> L1;list<int> L2(10, 5);vector<int> v{1,2,3,4…

精灵图,字体图标,CSS3三角

精灵图 1.1为什么需要精灵图 一个网页中往往会应用很多小的背景图像作为修饰&#xff0c;当网页中的图像过多时&#xff0c;服务器就会频繁的接受和发送请求图片&#xff0c;造成服务器请求压力过大&#xff0c;这将大大降低页面的加载速度。 因此&#xff0c;为了有效地减少…

【踏雪无痕的痕二】——小学一年级数学题窥探蝴蝶效应

目录 一、背景介绍二、思路&方案三、过程1.结果一致过程不一致带来的偏差2.再举两个例子&#xff0c;你品一品3.我曾经的培养计划背后的"力量"&#xff1f;4.蝴蝶效应——混沌或非线性理论什么是蝴蝶效应&#xff1f; 5.内心深处的小恶魔(人性的使然) 四、总结 一…

Java基础知识总结(持续更新中)

Java基础知识&#xff08;持续更新&#xff09; 类型转化&#xff1a;数字、字符串、字符之间相互转化 数字 <-> 字符串 // 数字转字符串 // method1int number 5;String str String.valueOf(number);// method2int number 5;Integer itr number; //int装箱为对…

使用耳机壳UV树脂制作一个耳机壳需要多长时间?

使用耳机壳UV树脂制作一个耳机壳所需的时间取决于多个因素&#xff0c;包括工艺流程、加工方式、设备和技术水平等。一般来说&#xff0c;制作一个耳机壳需要数小时到数天不等。 以下是影响制作时间的几个主要因素&#xff1a; 获取耳模时间&#xff1a;获取耳模的时间取决于…

数据库学习案例20240206-ORACLE NEW RAC agent and resource关系汇总。

1 集群架构图 整体集群架构图如下&#xff1a; 1 数据库启动顺序OHASD层面 操作系统进程init.ohasd run启动ohasd.bin init.ohasd run 集群自动启动是否被禁用 crsctl enable has/crsGIHOME所在文件系统是否被正常挂载。管道文件npohasd是否能够被访问&#xff0c; cd /var/t…

口腔助手|口腔挂号预约小程序|基于微信小程序的口腔门诊预约系统的设计与实现(源码+数据库+文档)

口腔小程序目录 目录 基于微信小程序的口腔门诊预约系统的设计与实现 一、前言 二、系统功能设计 三、系统实现 1、小程序前台界面实现 2、后台管理员模块实现 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xff1a; 五、核心代码 六、论文参考 七、最新…