编程竞赛必备算法精解

编程竞赛必备算法精解

枚举

例题

字符计数

        

反倍数

洁净数

扫雷

模拟

例题

饮料换购

图像模糊

螺旋矩阵

回文日期

长草

注意:该参考代码仅通过80%,仅作学习模拟的参考

最大距离

进制转换

例题

前缀和

一维前缀和

前缀和:对于一个长度为n的列表a,前缀和为:

 sum[i]= a[0]+a[1]+…+a[i]

例如:a= [1,3,4,2,5],前缀和数组sum=[1,4,8,10,15]

前缀和的性质:

Sum[i]=Sum[i-1]+a[i]

a[l] +…+a[r]= Sum[r]-Sum[l-1]

第一条性质用于处理出前缀和

第二条性质可以在O(1)的时间内求出区间和

前缀和实现一:

实现二

例题

区间次方和

代码如下:

小郑的蓝桥平衡串

代码如下:

二维前缀和

前缀和:对于N*M的二维列表a(下标统一从1开始),前缀和为:

例题

统计子矩阵

注:以下参考代码仅通过70%数据,仅作学习二维前缀和参考

差分

一维差分数组

对于一个数组a[], 差分数组diff[]的定义是: diff[i] = a[i] - a[i -1]

对差分数组做前缀和可以还原为原数组:

diff[1]+diff[2]+diff[3]+ ... +diff[i]
=a[1]+(a[2]-a[1])+(a[3]-a[2])+ ... +(a[i]-a[i-1])
= a[i]

例题

代码如下:

二维差分数组

离散化

离散化: 不关注数字本身,只关注大小关系时,利用排名代替原数据。

本质: 一种哈希,将离散的数字、浮点数,转换成1-n

例如:【100,200,300,400,500】,离散化后为【1,2,3,4,5】

所有仅关注偏序关系的题目,均可以先离散化

数组a的离散化步骤:

1、把a拷贝一份设置为b

2、对b排序、去重

3、把a中每个元素设置为b数组中的下标(二分查找)

法一:使用二分查找

注:

法二:使用字典

贪心

例题

谈判

  

糖果混合

代码如下

纪念品分组

代码如下:

翻硬币

代码如下:

日志统计

代码:

字典使用

构造

例题

大衣的邻近和

代码如下:

二分

浮点二分

例:估计根二的值

二分答案

题目所求答案(一般为整数)具有单调性质,采用猜答案+二分
1、确定初始范围[left,right]
2、当left≤right时:
      mid =(left+right)//2
      check(mid):判断mid是否合法:(定义check函数,什么时候是合法,根据题目的单调定来确定)
      如果合法:更新ans=mid
      根据合法调整左右区间,调整策略为二选一:left=mid+1,   right = mid -1

例题

分巧克力:

代码如下:

跳石头

代码如下:

肖恩的乘法表

代码如下:

双指针

反向扫描

例题

纪念品分组
回文判定

         

同向扫描

例题

美丽的区间

挑选子串

位运算

位运算技巧

1. 判断奇偶性:

        直接判断二进制的第0位是否为1或者0

        相当于直接判断x&1,结果是1就是奇数,结果是0就是偶数

2. 求出x二进制的第i位:

        获取第0位:直接&1

        先将第i位转成第0位 : 右移i位        (x>>i)&1

3. 将二进制的第i位设置为1:

        对(1 << i)进行或运算:x | (1 << i)

4. 将二进制的第i位设置为0:

        对~(1<<i)进行与运算:x & ( ~ (1 << i))

5.  判断是否为2的若干次方:

        判断x&(x-1)是否等于0

        因此2的若干次方二进制表示中只存在一个1,上述一定成立,并且上述成立时说明只有一个1

6. 获取x的最低位的 1:

        Lowbit(x)= x&(-x)

例题

二进制中1的个数

区间或

思路:

假如列表为【1,3,2,4,5】
那么他们的二进制是001,011,010,100,101
合起来第0位【1,1,0,0,1】第1位【0,1,1,0,0】第2位【0,0,0,1,1】
那么假如你要想判断区间2~5,即3,2,4,5
则第0位【1,0,0,1】进行或运算,第1位是【1,1,0,0】,第2位是【0,0,1,1】,得出来就是111,即7
那么我们在这里用一种快一点的判断方法(前缀和),或运算是有1得1,那么我们是是不是只有识别这个区间和大于0即可说明该区间有1
我们把原来的(第三行)换算成前缀和:第0位【1,2,2,2,3】第1位【0,1,2,2,2】第2位【0,0,0,1,2】
然后我们要判断区间2~5,是不是只要判断前缀和第0位的第5个数减去第1个数(前缀和公式),即3-1=2,说明有两个1,那么就可以判断第0位是1(这里需要了解前缀和)
那么我们就可以做一个循环,观察数据,发现二进制最多位数应该是31,那么我们就从0判断到30
假设第i位,我们就观察第i位的区间是不是大于0,大于0则为1,然后用(1<<i)表示第i位为1,且转成十进制
最后累加得出结果

Read more

CCF GESP C++讲义和真题汇总5级完整版

CCF GESP C++讲义和真题汇总5级完整版 序 言 当下各类编程和算法相关竞赛层出不穷,但多数比赛难度低、缺乏含金量;甚至个别比赛并非比拼学生能力,而是依赖老师带队编写程序,学生仅体验流程、花钱获取证书,此类比赛意义甚微。 GESP由举办CSP、NOIP和NOI竞赛的中国计算机学会(CCF)主办,可看作是“分期”版本的CSP-J。CSP-J一年仅一次考试,且难度较高、初赛通过率低,例如北京初赛通过率仅20%~30%,个别南方省份初赛分数线高达80多分,写错两道选择题便无法通过,错失当年考试机会。 GESP将CSP-J难度的内容划分为8个等级,学生可按顺序逐级报考,相当于分8次体验完整的CSP-J内容,避免难度陡增;且每年3、6、9、12月各有一次考试机会,一次未考好可学习三个月后再次报考,能为学生提供及时反馈,避免长期学习却难以入门。同时,GESP虽拆分了学习和考试阶段,但难度、内容与CSP-J基本一致,保有同等含金量。 目录 CCF编程能力等级认证概述 第一课 初等数论 * 知识点01:

By Ne0inhk

SketchUp STL插件终极指南:从数字设计到实体打印的完整教程

还在为SketchUp作品无法直接3D打印而烦恼吗?SketchUp STL插件就是你的完美解决方案!这个强大的Ruby扩展为SketchUp添加了完整的STL格式支持,让你的创意轻松转化为实体模型。🎯 【免费下载链接】sketchup-stlA SketchUp Ruby Extension that adds STL (STereoLithography) file format import and export. 项目地址: https://gitcode.com/gh_mirrors/sk/sketchup-stl 🚀 三步搞定插件安装 想要快速上手?跟着这个超简单的安装流程走: 第一步:获取插件文件 下载最新的RBZ格式安装包,这是SketchUp插件的标准打包格式。 第二步:安装扩展 打开SketchUp → 窗口 → 扩展管理器 → 安装扩展,选择下载的RBZ文件即可。 第三步:验证功能 重启SketchUp后,检查文件菜单是否新增了STL导入导出选项,确认插件安装成功! 💡 两大核心功能深度体验 导入功能:外部模型的完美融合 当你需要编辑现

By Ne0inhk
【STL】深度剖析 C++ string:从 0 到 1 的模拟实现与细节解析

【STL】深度剖析 C++ string:从 0 到 1 的模拟实现与细节解析

前言 string是 C++ 中最常用的字符串工具,但多数人只懂用、不懂其底层逻辑。 这篇会带你手搓一个简易string:从内存管理的构造 / 析构,到深拷贝的拷贝构造 / 赋值重载,再到基础接口封装,帮你吃透string的核心机制,同时掌握 C++ 类设计的关键思路。 📚 C++ 初阶 【……】 【 类和对象(下篇)】 【 C/C++内存管理 】 【 C++模版初阶 】 【 stl_string高频接口测试 】 目录 一、前置工作 二、默认成员函数 1、构造函数 2、析构函数 3、拷贝构造函数 4、赋值运算符重载 三、字符串操作接口 1、reserve 2、push_back 3、append 4、

By Ne0inhk
【C++指南】string(四):编码

【C++指南】string(四):编码

💓 博客主页:倔强的石头的ZEEKLOG主页             📝Gitee主页:倔强的石头的gitee主页             ⏩ 文章专栏:《C++指南》                                   期待您的关注 引言 在 C++ 编程中,处理字符串是一项极为常见的任务。而理解字符串在底层是如何编码存储的,对于编写高效、健壮且可移植的代码至关重要。 本文将深入探讨 C++ 中string所涉及的多种编码规则,包括 ASCII、Unicode、UTF - 8、UTF - 16 和 UTF - 32 等,并着重讲解 UTF - 8 编码以及它在string中灵活存储字符串的机制。 常见编码规则介绍 ASCII 编码 ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是最古老且最基础的编码方式之一。

By Ne0inhk