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

news2025/1/11 11:15:54

前言

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

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';
        else
            cout<<"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) {//a1
		rep(j, 1, 3) {//a2
			rep(k, 1, 3) {//a3
				a[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 {//红黑结点数都 > 0
				cout << 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_mod
		for (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.coloradmin.cn/o/1444502.html

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

相关文章

回归预测模型:MATLAB多项式回归

1. 多项式回归模型的基本原理 多项式回归是线性回归的一种扩展&#xff0c;用于分析自变量 X X X与因变量 Y Y Y之间的非线性关系。与简单的线性回归模型不同&#xff0c;多项式回归模型通过引入自变量的高次项来增加模型的复杂度&#xff0c;从而能够拟合数据中的非线性模式。…

【Linux进程间通信】用管道实现简单的进程池、命名管道

【Linux进程间通信】用管道实现简单的进程池、命名管道 目录 【Linux进程间通信】用管道实现简单的进程池、命名管道为什么要实现进程池&#xff1f;代码实现命名管道创建一个命名管道 理解命名管道匿名管道与命名管道的区别命名管道的打开规则 作者&#xff1a;爱写代码的刚子…

LLM之RAG实战(二十五)| 使用LlamaIndex和BM25重排序实践

本文&#xff0c;我们将研究高级RAG方法的中的重排序优化方法以及其与普通RAG相比的关键差异。 一、什么是RAG&#xff1f; 检索增强生成&#xff08;RAG&#xff09;是一种复杂的自然语言处理方法&#xff0c;它包括两个不同的步骤&#xff1a;信息检索和生成语言建模。这种方…

ShardingSphere 5.x 系列【7】元数据持久化

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1.概述2. 单机模式2.1 H22.2 MySQL3. 集群模式3.1 ZooKeeper3.2 Nacos3.3 Co…

第十八篇【传奇开心果短博文系列】Python的OpenCV库技术点案例示例:图像修复和恢复

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例系列短博文目录前言一、常用的图像修复与恢复技术二、插值方法示例代码三、基于纹理合成的方法示例代码四、基于边缘保持的方法示例代码五、基于图像修复模型的方法示例代码六、基于深度学习的方法示例代码七…

基于centos的Linux中如何安装python

前言 之前在linux上安装python的时候没来及记录下来&#xff0c;感觉还是有必要的&#xff0c;所以现在打算把原来装好的python卸载掉&#xff0c;然后重装一遍&#xff0c;重新记录一下。当前环境是否安装python 通过查询我发现机器里有3个版本的python&#xff0c;第一个是…

《杨绛传:生活不易,保持优雅》读书摘录

目录 书简介 作者成就 书中内容摘录 良好的家世背景&#xff0c;书香门第为求学打基础 求学相关 念大学 清华研究生 自费英国留学 法国留学自学文学 战乱时期回国 当校长 当小学老师 创造话剧 支持钱锺书写《围城》 出任震旦女子文理学院的教授 接受清华大学的…

【开源】SpringBoot框架开发APK检测管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 开放平台模块2.3 软件档案模块2.4 软件检测模块2.5 软件举报模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 开放平台表3.2.2 软件档案表3.2.3 软件检测表3.2.4 软件举报表 四、系统展示五、核心代…

C++中类的6个默认成员函数【构造函数】 【析构函数】

文章目录 前言构造函数构造函数的概念构造函数的特性 析构函数 前言 在学习C我们必须要掌握的6个默认成员函数&#xff0c;接下来本文讲解2个默认成员函数 构造函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c…

嵌入式硬件越老越吃香,确实没错!

不知不觉已经从事硬件设计7年多了&#xff0c;7年对于一个从事硬件设计来说能有几个完整的生涯。2016年毕业&#xff0c;2023年即将结束&#xff0c;我已经在汽车这行业“摸爬滚打”了7年的时光。 回顾这7年&#xff0c;自己真的成长了很多很多。有项目失败整改的经验收获&…

java实现文件随机加密

1、引言 有时候我们需要对我们的某些文件数据进行加密&#xff0c;并且不希望被轻易破译&#xff0c;此时最好不要使用已知的加密方法&#xff0c;这里我就给大家提供一种数据加密的方式&#xff0c;用以实现文件数据的加密&#xff0c;我称之为随机加密&#xff0c;即使是对相…

【FPGA】Verilog:奇偶校验位发生器 | 奇偶校验位校验器

目录 0x00 奇偶校验位发生器 0x01 奇偶校验位校验器 0x02 错误检测器和纠错器

Failed to construct ‘RTCIceCandidate‘ sdpMid and sdpMLineIndex are both null

最近在搞webrtc&#xff0c;在编写函数处理远端传递来的candidate时报错了&#xff0c;具体信息如下。国内关于webrtc的资料很少&#xff0c;所以去国外社区转了一圈&#xff0c;回来记录一下报错的解决方案 其实这个bug也好解决&#xff0c;根据报错信息可以判断是RTCIceCand…

数据结构(2) 线性表

线性表 线性表的定义线性表的基本操作lnitList(&L)DestroyList(&L)Listlnsert(&L,i,e)ListDelete(&L,i,&e)LocateElem(L,e)GetElem(L,i)Length(L)PrintList(L)Empty(L)Tips:引用值 小结 根据数据结构的三要素–逻辑结构、数据的运算、存储结构&#xff0c;…

第78讲 修改密码

系统管理实现 修改密码实现 前端 modifyPassword.vue&#xff1a; <template><el-card><el-formref"formRef":model"form":rules"rules"label-width"150px"><el-form-item label"用户名&#xff1a;&quo…

Game辅助推广购卡系统全新一键安装版-已激活

(购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买) 资源简介 运行环境 PHP5.6~7.0+MYSQL5.6 本程序可配合(伯乐发卡)基础版使用; 界面炫酷大气!程序内核为yunucm…

智能时代:创新创业的新机遇与挑战

智能时代为创新创业提供了广阔的空间和无限的可能性。以下是一些可能适合智能时代背景的创新创业方向&#xff1a; 人工智能技术应用&#xff1a;人工智能技术是当前科技领域最热门的技术之一&#xff0c;其应用范围不断扩大。创业者可以将人工智能技术应用于各个领域&#xf…

Netty应用(五) 之 Netty引入 EventLoop

目录 第三章 Netty 1.什么是Netty&#xff1f; 2.为什么需要使用Netty&#xff1f; 3.Netty的发展历程 4.谁在使用Netty&#xff1f; 5.为什么上述这些分布式产品都使用Netty&#xff1f; 6.第一个Netty应用 7.如何理解Netty是NIO的封装 8.logback日志使用的加强 9.Ev…

特殊形势下如何自主创新创业

当下的经济形势相信每个人都有不断的判断&#xff0c;但比较一致的观点是经济下行趋势十分明显&#xff0c;无论是传统的建筑以及相应的建材、家居、家电行业&#xff0c;还是曾红极一时的IT行业&#xff0c;甚至是芯片业行&#xff0c;都出现了严重的需求不足、产能过剩。从而…

AI:125-基于深度学习的航拍图像中地物变化检测

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…