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

}

 智乃的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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java串口通信技术探究2:RXTX库单例测试及应用

目录 一、创建串口工具类二、串口工具测试三、运行时会遇到的错误JVM崩溃无法找到指定的类 本文主要介绍了Java串口通信技术探究&#xff0c;重点分析了RXTX库单例测试以及串口工具的使用。通过实例演示了如何使用SerialPortTool类进行串口操作&#xff0c;包括打开串口、关闭串…

Unity入门学习

目录 Unity环境搭建Unity引擎是什么软件下载和安装工程文件夹 Unity界面基础Scene场景和Hierarchy层级窗口Game游戏和Project工程Inspector和Console工具栏和父子关系 Unity工作原理反射机制和游戏场景预设体和资源包的导入导出 Unity脚本基础脚本基本规则生命周期函数Inspecto…

Codeforces Round 886 (Div. 4)补题

To My Critics&#xff08;Problem - A - Codeforces&#xff09; 题目大意&#xff1a;现有一个三位数&#xff0c;问能否从中抽取两个数使得和大于等于10. 思路&#xff1a;排个序&#xff0c;取大的两个即可。 #include<bits/stdc.h> using namespace std; int mai…

编译环境搭建及基础实验

1.VS code安装 Linux 版本安装 把资料盘里的安装包.deb拷贝到Ubuntu中&#xff0c; 使用如下命令安装&#xff1a; 软件图标都在目录/usr/share/applications 中&#xff0c;如图路径 复制到桌面中 Visual Studio Code 插件的安装 我们需要按照的插件有下面几个&#xff1a;…

CSS高级技巧

一、 精灵图 1.1 为什么需要精灵图&#xff1f; 1.2 精灵图&#xff08;sprites&#xff09;的使用 二、 字体图标 2.1 字体图标的产生 2.2 字体图标的优点 2.3 字体图标的下载 icomoom字库 http://icomoon.io 阿里iconfont字库 http://www.iconfont.cn/ 2.4 字体图标的引用…

深度学习的进展及其在各领域的应用

深度学习&#xff0c;作为人工智能的核心分支&#xff0c;近年来在全球范围内引起了广泛的关注和研究。它通过模拟人脑的学习机制&#xff0c;构建复杂的神经网络结构&#xff0c;从大量数据中学习并提取有用的特征表示&#xff0c;进而解决各种复杂的模式识别问题。 一、深度…

腾讯云4核8G服务器最大能承载多少用户在线?12M带宽

腾讯云轻量4核8G12M轻量应用服务器支持多少人同时在线&#xff1f;通用型-4核8G-180G-2000G&#xff0c;2000GB月流量&#xff0c;系统盘为180GB SSD盘&#xff0c;12M公网带宽&#xff0c;下载速度峰值为1536KB/s&#xff0c;即1.5M/秒&#xff0c;假设网站内页平均大小为60KB…

CSP-202012-2-期末预测之最佳阈值

CSP-202012-2-期末预测之最佳阈值 【70分思路】 本题的难点还是时间复杂度&#xff0c;暴力枚举会导致时间超限。对于每一个可能的阈值theta&#xff0c;代码都重新计算了整个predict数组&#xff0c;统计预测正确的数目&#xff0c;因为有两个嵌套的循环&#xff0c;使得时间…

ClickHouse的优缺点和应用场景

当业务场景需要一个大批量、快速的、可支持聚合运算的数据库&#xff0c;那么可选择ClickHouse。 选择ClickHouse 的原因&#xff1a; 记录类型类似于LOG&#xff0c;读取、运算远远大于写入操作选取有限列&#xff0c;对近千万条数据&#xff0c;快算的运算出结果。数据批量…

springboot176基于Spring Boot的装饰工程管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

网络请求库axios

一、认识Axios库 为什么选择axios? 功能特点: 在浏览器中发送 XMLHttpRequests 请求在 node.js 中发送 http请求支持 Promise API拦截请求和响应转换请求和响应数据 补充: axios名称的由来? 个人理解没有具体的翻译. axios: ajax i/o system 二、axios发送请求 1.axios请求…

2.6日学习打卡----初学RabbitMQ(一)

2.6日学习打卡 初识RabbitMQ、 一. MQ 消息队列 MQ全称Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保 存消息的容器。多用于系统之间的异步通信。 同步通信相当于两个人当面对话&#xff0c;你一言我一语。必须及时回复 异步通信相当于通…

Redis核心技术与实战【学习笔记】 - 27.限制Redis Cluster规模的因素(通信开销)

简述 Redis Cluster 能保存的数据量以及支撑的吞吐量&#xff0c;跟集群实例规模相关。 Redis 官方给出了 Redis Cluster 的规模上线&#xff0c;就是一个集群运行 1000 个实例。 其实&#xff0c;限定 Redis Cluster 集群规模的一个关键因素就是&#xff0c;实例间的通信开销…

入门指南|Chat GPT 的兴起:它如何改变数字营销格局?

随着数字营销的不断发展&#xff0c;支持数字营销的技术也在不断发展。OpenAI 的 ChatGPT 是一项备受关注的突破性工具。凭借其先进的自然语言处理能力&#xff0c;ChatGPT 已被证明是全球营销人员的宝贵资产。在这份入门指南中&#xff0c;我们将探讨Chat GPT对数字营销专家及…

社区店选址要素揭秘:人流量与商业潜力的关键

开店五年&#xff0c;我深刻体会到选址对于社区店的重要性。 不管是哪个行业的实体店&#xff0c;选址更是决定成败的关键因素之一。今天&#xff0c;我就以一名资深鲜奶吧创业者的身份&#xff0c;来揭秘社区店选址的几大要素&#xff0c;帮助大家在创业的道路上少走弯路。 …

Maven - 编译报错:程序包 XXX 不存在(多模块项目)

问题描述 编译报错&#xff1a;程序包 XXX 不存在&#xff08;多模块项目&#xff09; 原因分析 检查依赖模块 pom 文件&#xff0c;看是不是引入了如下插件 <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-pl…

【深度学习】实验7布置,图像超分辨

清华大学驭风计划 因为篇幅原因实验答案分开上传&#xff0c; 实验答案链接http://t.csdnimg.cn/P1yJF 如果需要更详细的实验报告或者代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢迎私信博主&#xff0c;大家可以相互讨论交流哟~~ 深度学习训练营 案例 7 &#xff1…

2024年【起重机司机(限桥式起重机)】最新解析及起重机司机(限桥式起重机)考试资料

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 起重机司机(限桥式起重机)最新解析是安全生产模拟考试一点通生成的&#xff0c;起重机司机(限桥式起重机)证模拟考试题库是根据起重机司机(限桥式起重机)最新版教材汇编出起重机司机(限桥式起重机)仿真模拟考试。2024…

Idea里自定义封装数据警告解决 Spring Boot Configuration Annotation Processor not configured

我们自定对象封装指定数据&#xff0c;封装类上面一个红色警告&#xff0c;虽然不影响我们的执行&#xff0c;但是有强迫症看着不舒服&#xff0c; 去除方式&#xff1a; 在pom文件加上坐标刷新 <dependency><groupId>org.springframework.boot</groupId><…

Stata实证命令代码汇总

Stata代码命令汇总 数据内容&#xff1a;包括数据导入和管理、数据的处理、描述性统计、相关性分析、实证模型、内生性解决、检验分析、结果导出 具体如下&#xff1a; 一、数据导入和管理&#xff1a;数据导入、数据导出 二、数据的处理&#xff1a;生成新变量、格式转换、…