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;
}

智乃的相亲活动

 

这概率题其实不难,关键在于高中的概率论知识要记得。

分析:一个人想要成为心动嘉宾,就至少有一个异性选。

例如:有三个人xyz,假如y选x的概率是1/3,z选x的概率是1/2,那么x被选的概率是多少?

从正面考虑,P(x被选) = P(y选x) + P(z选x) - P(y和z同时选x)。

但如果有四个人,xyzk,yzk对x进行选择,人数一多就不好从正面考虑了。

因此我们考虑逆事件的概率,P(x被选) = 1 - P(x不被选),这样就容易多了。

心动男嘉宾数目期望 = 每个男生成为心动男嘉宾的期望 * 每个男生的贡献(为1)  之和

女嘉宾同理。

double pb[N], pg[N];//不成为心动嘉宾的概率
vector<int> b[N], g[N];
void solve() {int n, m, k; cin >> n >> m >> k;rep(i, 1, n) pb[i] = 1;rep(i, 1, m) pg[i] = 1;while (k--) {int u, v; cin >> u >> v;b[u].push_back(v);g[v].push_back(u);}for (int i = 1; i <= n; i++) {double k = b[i].size();for (auto x : b[i]) {pg[x] *= (k - 1) / k;}}for (int i = 1; i <= m; i++) {double k = g[i].size();for (auto x : g[i]) {pb[x] *= (k - 1) / k;}}double ans1 = 0, ans2 = 0;rep(i, 1, n) {ans1 += 1-pb[i];}rep(i, 1, m) {ans2 += 1-pg[i];}cout << "float" << endl;printf("%.10f %.10f\n", ans1, ans2);
}

1.概率基本公式

(1)逆事件的概率

(2)加法公式

(3)减法公式

(4)条件概率

(5)乘法公式

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

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

相关文章

【嵌入式-定时器】通过呼吸灯案例使用逻辑分析仪分析PWM波形

目的&#xff1a;通过实现呼吸灯分析PWM波形 代码&#xff1a; PWM.c #include "stm32f10x.h" // Device header/*** brief PWM初始化* param 无* retval 无 */ void PWM_Init(void) {// 使能IO和TIM2RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM…

错误的集合(力扣刷题)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 由于作者比较菜&#xff0c;还没学malloc这个函数&#xff0c;因此这个题目只写一些与原题大致的思路。 题目链接&#xff1a;645. 错误的集合 - 力扣…

【Django】Django文件上传

文件上传 1 定义&场景 定义&#xff1a;用户可以通过浏览器将图片等文件上传至网站。 场景&#xff1a; 用户上传头像。 上传流程性的文档[pdf&#xff0c;txt等] 2 上传规范-前端[html] 文件上传必须为POST提交方式 表单 <form> 中文件上传时必须带有 enctype…

创建你的第一个Vue项目(小白专享版本)

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

controlnet的模型下载

controlnet模型有sd15和基于sd15上的fp16版本 fp16版本的模型比较小&#xff0c;但功能效果跟sd15是一样的 controlnet的fp16模型下载地址 https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/tree/main controlnet的openpose里&#xff0c;有个dw_open…

Structured Streaming

目录 一、概述 &#xff08;一&#xff09;基本概念 &#xff08;二&#xff09;两种处理模型 &#xff08;三&#xff09;Structured Streaming和Spark SQL、Spark Streaming关系 二、编写Structured Streaming程序的基本步骤 &#xff08;一&#xff09;实现步骤 &…

【GAMES101】Lecture 22 物理模拟与仿真

目录 单粒子模拟 显式欧拉方法 改进 中点法/修正的欧拉方法 自适应步长 隐式欧拉方法 非物理改变位置&#xff08;Position-Based / Verlet Integration&#xff09; 刚体模拟 流体模拟 单粒子模拟 先来研究粒子的运动&#xff0c;假设有一个速度矢量场&#xff0c;对…

Java:字符集、IO流 --黑马笔记

一、字符集 1.1 字符集的来历 我们知道计算机是美国人发明的&#xff0c;由于计算机能够处理的数据只能是0和1组成的二进制数据&#xff0c;为了让计算机能够处理字符&#xff0c;于是美国人就把他们会用到的每一个字符进行了编码&#xff08;所谓编码&#xff0c;就是为一个…

(已解决)将overleaf上的文章paper上传到arxiv上遇到的问题。

文章目录 前言初级问题后续问题 前言 首先说一点&#xff0c;将paper的pdf文件直接上传arxiv是不行的&#xff0c;arxiv要求我们要上传源文件&#xff0c;所以才这么麻烦。 初级问题 首先上传文件之后有可能会在下面这个界面出现问题&#xff0c;这里一般都比较常见的问题&a…

Latex排版遇到的常见问题及解决方法

这里写目录标题 1. 图片/ PDF 裁剪1.1 PPT 画图转PDF1.2 PPT裁剪 2. 表格内的文本换行问题2.1 表格跨行显示2.2 表格内文本换行&#xff0c;使用 ‘makecell’ 包 换行2.2 表格内文本添加 圆点 1. 图片/ PDF 裁剪 1.1 PPT 画图转PDF 1.2 PPT裁剪 将输出的PDF文件裁剪成合适尺…

最新酒桌小游戏喝酒小程序源码,带流量主,附带搭建教程

喝酒神器&#xff0c;增加了广告位&#xff0c;根据文档直接替换即可&#xff0c;原版本没有广告位 直接上传源码到开发者端即可 通过后改广告代码&#xff0c;然后关闭广告展示提交&#xff0c;通过后打开即可 搜索adunit-848e5f13d1ff237a替换为你的Banner 搜索adunit-597…

【Spring学习】Spring Data Redis:RedisTemplate、Repository、Cache注解

1&#xff0c;spring-data-redis官网 1&#xff09;特点 提供了对不同Redis客户端的整合&#xff08;Lettuce和Jedis&#xff09;提供了RedisTemplate统一API来操作Redis支持Redis的发布订阅模型支持Redis哨兵和Redis集群支持基于Lettuce的响应式编程支持基于JDK、JSON、字符…

2013-2022年上市公司迪博内部控制指数、内部控制分项指数数据

2013-2022年上市公司迪博内部控制指数、分项指数数据 1、时间&#xff1a;2013-2022年 2、范围&#xff1a;上市公司 3、指标&#xff1a;证券代码、证券简称、辖区、证监会行业、申万行业、内部控制指数、战略层级指数、经营层级指数、报告可靠指数、合法合规指数、资产安全…

three.js 细一万倍教程 从入门到精通(二)

目录 三、全面认识three.js物体 3.1、掌握几何体顶点_UV_法向属性 3.2、BufferGeometry设置顶点创建矩形 3.3、生成酷炫三角形科技物体 四、详解材质与纹理 4.1、初识材质与纹理 4.2、详解纹理偏移_旋转_重复 偏移 旋转 重复 4.3、设置纹理显示算法与mipmap mapFil…

《UE5_C++多人TPS完整教程》学习笔记8 ——《P9 访问 Steam(Acessing Steam)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P9 访问 Steam&#xff08;Acessing Steam&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译者&…

《Linux 简易速速上手小册》第10章: 性能监控与优化(2024 最新版)

文章目录 10.1 理解系统负载10.1.1 重点基础知识10.1.2 重点案例&#xff1a;服务器响应变慢10.1.3 拓展案例 1&#xff1a;多核 CPU 系统的负载解读10.1.4 拓展案例 2&#xff1a;分析具体时间段的系统负载 10.2 优化性能10.2.1 重点基础知识10.2.2 重点案例&#xff1a;优化 …

没更新的日子也在努力呀,布局2024!

文章目录 ⭐ 没更新的日子也在努力呀⭐ 近期的一个状态 - 已圆满⭐ 又到了2024的许愿时间了⭐ 开发者要如何去 "创富" ⭐ 没更新的日子也在努力呀 感觉很久没有更新视频了&#xff0c;好吧&#xff0c;其实真的很久没有更新短视频了。最近的一两个月真的太忙了&#…

CSP-202312-2-因子化简(质数筛法)

CSP-202312-2-因子化简 一、质数筛法 主流的质数筛法包括埃拉托斯特尼筛法&#xff08;Sieve of Eratosthenes&#xff09;、欧拉筛法&#xff08;Sieve of Euler&#xff09;、线性筛法&#xff08;Linear Sieve&#xff09;等。这些算法都用于高效地生成一定范围内的质数。 …

二叉搜索树题目:二叉搜索树的最小绝对差

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;二叉搜索树的最小绝对差 出处&#xff1a;530. 二叉搜索树的最小绝对差 难度 3 级 题目描述 要求 给定一个二叉…

java对象内部都有哪些东西

普通对象 对象头 markword 占8字节ClassPointer 指针 :-XX userCompressedClassPointrs 为4字节&#xff0c;不开启为 8字节实例数据 引用类型: -XX userCommpressedOops 为4字节&#xff0c;不开启8字节Padding对齐&#xff0c; 8的倍数 数组对象 对象头&#xff1a;markwor…