写在前面
首先对于在现代学习过程中给予我莫大帮助的 3Blue1Brown
(3B1B) 表示诚挚的感谢!
其次明确此系列博文的目的: - 不同于对于大学线代课程的预习,
这些文章的目的主要在于揭示线代的简明性,
并在前人的基础上加以自己的理解,
从而尝试提出更为初等的理论 -
是对于3B1B视频的理解以及自己的总结,
并在某种程度上减少今后再次查阅视频所消耗的时间
最后声明
若未特殊说明,本文所提到的一切概念默认在二维/三维直角坐标系中
本文属于学习笔记范畴,请确保文章仅用于学习交流目的,对于其中内含的3B1B视频中的结论、观点以及截图,若有侵权请联系删除
0.线代环境
0.1 线代应用方面
很多人(包括我自己)跟着教材初学线代时对于线代这个东西的作用一头雾水,
极为抽象的概念(如行列式, 矩阵, 特征值等)连珠炮似的砸过来,
很容易造成只会计算却不懂得应用的情况.
线代归根结底依旧是工具,
因此在学习之初明确其应用场景就显得尤为必要
简而言之, 线代较为广泛地被应用在: - 计算机科学
(主要是人工智能训练架构中) - 物理学
(主要是发挥矢量相关作用) - 数学
(主要是多维数据 ...
1. 情景引入
在现代校园生活中,
快递服务已成为师生不可或缺的部分假设我们需要在校园内设立一个快递站,
服务于校内的学生
提出问题
驿站选点能否让大部分师生在日常生活中大概率经过至少一次
如何选点, 使得从校园内所有需求点出发, 抵达驿站的总取件路程最小
若要求每个需求点到达驿站的距离最远不超过 , 最少需要设置多少个驿站?
考虑通行时间以及人流关于时间的分布,
如何使得师生等待时间尽可能少?
上述问题中, 考虑可行性, 选择问题2与问题4
2. 数学理想化加工
面对复杂的校园环境, 我们首先进行合理的简化与假设:
道路网络简化:
校园主干道构成一个连通无环的网络,
即任意两个路口之间只有唯一一条路径
站点位置限制:
快递站必须建立在路口(节点)上, 而非道路中间
路径行为: 学生文明有道德,
即沿着道路行走, 不能穿越建筑或草坪
需求分布:
每个宿舍区的学生人数可以归属于其最近的路口,
即每个路口设置一个需求权重,
这个数值可以通过调查宿舍区名单等轻易获得
一些其他现实细节
只考虑平面移动距离
只考虑从需求点前往驿站的时间, 不考虑后续返回的时间
将所有人步行速度视为相同 ...
Manim学习笔记
本文仅讨论Manim社区版的使用
1. 安装
他讲得比我好,
绝对不是我懒得写
Linux/Mac 见自行搜索各自的安装教程
(都用Linux/Mac了相信至少已经不是小白级别的了),
一般来说cairo pango ffmpeg TexLive是必须的
正常来说走完这些流程Manim就可以使用了, 不用其他乱七八糟的操作
1.1 安装Manim(社区版)
123456# (虚拟环境, 可选)python -m venv venvvenv/Scripts/activate# 安装pip install manim
如果出现Visual C++一类的报错, 安装Visual
Studio Build Tools
1.2 安装FFmpeg
下载链接 下载后解压缩,
把bin文件夹加入环境变量Path
1.3 安装Tex
建议用MikTex, 小巧灵活
1.4 安装Sox
下载链接
1.5 验证
1234manim -vlatex -vffmpegsox
你也可以选择写一个简单的manim脚本测试一下
1234567891011121314151617 ...
OI学习笔记:枚举与模拟算法详解
一、枚举算法
1.1 一维枚举
核心原理
通过单层循环遍历所有候选解,适用于解空间较小的问题。关键优化点在于缩小搜索范围和减少无效检查。
例题:素数判定(洛谷P1075)
问题分析
给定整数n,判断是否为素数(只能被1和自身整除)
优化思考
1. 边界处理:n≤1直接返回非素数
2. 范围优化:若n有因数k,则必存在k≤\(\sqrt n\),因此遍历范围缩小到[2, \(\sqrt n\)]
3.
奇偶剪枝:除2外所有偶数都不是素数,从3开始检查且步长为2
1234567891011121314151617181920212223#include <iostream>using namespace std;int main() { int n; cin >> n; if (n <= 1) { cout << "No"; return 0; // 特判边界 } if (n == 2) { ...
迷宫探险游戏开发日志
二、交互系统设计与优化
1. 跨设备输入适配 (
问题:移动端与桌面端操作体验不一致
解决方案:双重事件监听与节流控制 123456789101112// 触摸事件处理(300ms双击检测)let lastTap = 0;canvas.addEventListener('touchstart', e => { const now = Date.now(); if (now - lastTap < 300) this.handleDoubleTap(pos); else lastTap = now;});// 鼠标事件处理canvas.addEventListener('mousedown', e => { this.selectBlock(pos);}); -
统一坐标换算逻辑 - 增加300ms操作冷却时间
2. 动态障碍物系统
问题:困难模式需要动态改变迷宫结构
实时扰动机制: 123456789101112// 每15秒随机旋转30%方块 ...
信息学竞赛实用内置算法与技巧学习笔记
算法复杂度概述
在信息学竞赛中,
算法的时间复杂度和空间复杂度是衡量算法效率的重要指标.为了更全面地分析算法性能,
我们还需要了解均摊复杂度的概念及其计算方式.
时间复杂度计算方式
时间复杂度主要通过分析算法中基本操作的执行次数来确定.基本操作通常是循环、比较、算术运算等.
排序算法(sort):
排序算法的时间复杂度通常由比较和交换操作的次数决定.快速排序的平均时间复杂度为
O(n log n), 其中 n
是待排序元素的数量.这是因为快速排序将数组分成两部分, 递归排序每一部分,
并且每次递归处理大约需要 O(n) 的时间.递归深度为
O(log n), 因此总时间复杂度为 O(n log n).
二分查找算法(binary_search): 二分查找的时间复杂度为
O(log n), 其中 n
是有序数组的大小.这是因为每次比较将搜索范围减半,
直到找到目标元素或搜索范围为空.比较的次数与数组大小的对数成正比.
生成下一个排列(next_permutation): next_permutation
的时间复杂度为 O(n), 其中 n
是排 ...
系统功能更新
数据库更新
更新了获取所有白名单群聊的方法
更新了通过微信号获取用户信息的方法
更新了设置群聊简介的方法
敏感词更新
更新了敏感词增删及保存的方法
插件更新
加群插件
在微信机器人项目中, 交流群是必不可少的,
但要是通过群主一个个手动拉人进群, 那也太麻烦了.因此,
我们需要实现一个自动加群的功能, 这样一来,
机器人就可以自动将新用户拉入群聊中
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657# plugins/GroupInvite/main.py@on_text_messageasync def send_group_invite(self, bot: LegendWechatBot, msg: WxMsg): if not self.enable: return if msg.from_group(): to, at = msg.roomid, m ...
系统功能更新
日志翻新
日志内容优化
由于日志系统过于简陋, 且可读性极低, 甚至中英文夹杂,
现在重新设计日志系统, 对于插件数据库以及系统日志都做了优化
旧版日志(部分还能入眼的): 1232025-03-28 21:31:08 | INFO | LegendBotDB:495 - Database: Set chatroom 49981891388@chatroom whitelist successfully2025-03-28 21:31:08 | ERROR | LegendBotDB:500 - Database: Set chatroom 49981891388@chatroom whitelist failed, error: (sqlite3.IntegrityError) NOT NULL constraint failed: chatroom.chatroom_id[SQL: INSERT INTO chatroom (members, whitelist, llm_thread_id) VALUES (?, ?, ?)] 新版日志 1234567 ...
1. pair 的使用
1.1 特点与适用场景
特点: pair 是 C++
标准库中的一个模板类,用于存储两个不同类型的数据它提供了快速访问两个元素的接口
适用场景:
当需要同时存储两个相关数据时,比如键值对、二维点坐标、或者需要按某个字段排序时
1.2 典型操作
定义: pair<Type1, Type2> p;
初始化: pair<int, int> p(1, 2);
或 auto p = make_pair(1, 2);
访问元素: p.first 和
p.second
排序: pair 默认按 first
排序,first 相同时按 second 排序
1.3 使用实例
12345678910111213#include <iostream>#include <vector>#include <algorithm>using namespace std;int main() { vector<pair<int, string>> vec = {{3, ...
auto 你是我的神
1. vector
特点:动态数组,支持随机访问,插入和删除效率较低。
适用场景:需要频繁随机访问的场景。
典型操作:
push_back(): 添加元素到末尾。
pop_back(): 删除末尾元素。
size(): 获取当前大小。
capacity(): 获取当前容量。
resize(): 调整大小。
erase(): 删除指定位置的元素。
clear(): 清空容器。
1234567891011121314151617181920212223242526272829#include <iostream>#include <vector>using namespace std;int main() { vector<int> vec; vec.push_back(1); vec.push_back(2); vec.push_back(3); cout << "Vector size: " << vec.size() << ...










