汇编基础知识
汇编语言的组成
汇编三类指令:
汇编指令,机器码的助记符(核心)
伪指令,没有对应的机器码,由编译器执行,计算机并不执行
其他符号,如 +、-、*、/,没有对应的机器码,由编译器识别
指令和数据
指令和数据是应用上的概念,在内存或磁盘上指令和数据没有任何区别。CPU 工作时将有的信息看做指令,将有的信息看做数据。
存储单元
存储器被划分为多个存储单元,一个存储单元存储 1 Byte 信息,8 个二进制位。
CPU 对存储器的读写
需要与外部器件进行 3 类信息交互:
地址信息
控制信息
数据信息
CPU 通过总线将地址、控制、数据传到存储器芯片。总线分为 3 类:地址总线、控制总线、数据总线。
地址总线
地址总线上能传递多少个不同的信息,CPU 就能对多少个存储单元进行寻址。一个 CPU 有 N 根地址线,这个 CPU 的地址总线的宽度为 N,最多可以访问 2N2^N2N 个内存单元。
数据总线
CPU 与内存或其他芯片之间的数据传输通过数据总线进行。
控制总线
CPU 通过控制总线向其他外部设备发送控制信号。
内存地址空间
CPU 可寻址的内存大小。2N2^N ...
贪心二
排序不等式
排队打水
原题链接
按照装满水所需时间,让所有人从小到大排队。
证明:
假设排队的序列为 t1,t2,… ,ti,ti+1,… ,tnt_1, t_2, \dotso, t_i, t_{i+1}, \dotso, t_nt1,t2,…,ti,ti+1,…,tn。
总等待时间=t1⋅(n−1)+t2⋅(n−2)+⋯+tn−1总等待时间 = t_1 \cdot (n-1) + t_2 \cdot (n-2) + \dotsb + t_{n-1}总等待时间=t1⋅(n−1)+t2⋅(n−2)+⋯+tn−1
其中第 i 和第 i + 1 个人没有按照从小到大的顺序排队,ti>ti+1t_i > t_{i+1}ti>ti+1
此时这两人等待时间为 tit_{i}ti
而如果让第 i + 1 个人排在第 i 个人前面,这两人的等待时间为 ti+1t_{i+1}ti+1,显然优于交换前的等待时间,优化了 ti−ti+1t_i - t_{i+1}ti−ti+1 的时间。
1234567891011121314151617#include & ...
贪心一
区间问题
可以尝试左端点排序,右端点排序,双关键字排序
区间选点
原题链接
贪心思路:
将所有区间按照右端点排序
从前往后依次枚举每个区间
如果当前区间中已经包含点,直接跳过
否则选择当前区间右端点
证明:
假设最少的选择方案需要选出 ans 个点,按照上面的算法选出了 cnt 个点。显然 ans ≤ cnt。
按照上述算法能够选出 cnt 个互相不重叠的区间,这些区间中都被选中了右端点,要想让所有区间内都有点,最少选择的点 ans ≥ cnt。
所以 ans = cnt,按照上述算法选出的点的数量就是最小数量。
1234567891011121314151617181920212223242526272829#include <algorithm>#include <iostream>using namespace std;const int N = 1e5 + 10;struct Range { int l; int r; bool operator<(const Range &R) { return r ...
动态规划三
状态压缩 DP
状态是一个整数,将它看成一个二进制数,里面的一和零代表不同的状态。
蒙德里安的梦想
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647#include <cstring>#include <iostream>using namespace std;const int N = 12, M = 1 << N;int n, m;// f[i][j] 表示 1 x 2 长方形从 i-1 列捅到 i 列,且这种参差不齐的状态可以表示为 j 的所有方案数。j 看做一个二进制数,如果横着的长方形从 i-1 列捅到 i 列,该位记为 1,否则记为 0long long f[N][M];// st[i] 表示 i 这种状态是否合法,例如 (1010)2 这种状态 st[10] 不合法,因为这样的列中连续是空的格子的长度为奇数,无法被竖着的 2 x 1 长方形填满bool st[M];int main() { int n ...
向上取整和向下取整
⌈x/y⌉=(x+y−1)/y\lceil x/y \rceil = (x+y-1)/y⌈x/y⌉=(x+y−1)/y
每日打卡-LeetCode-81-搜索旋转排序数组2
原题链接
需要两次二分,第一次二分搜索旋转点的位置,第二次在旋转点的左侧或者右侧搜索目标值。二分不一定有序,但必须能找到一个性质将原问题分成两部分。本题中旋转点右侧的数小于数组第一个数,这个性质可以将原数组一分为二,因此可以二分找出旋转点。
需要注意的是,由于数组中有重复的数,需要将数组后半段中最后一段中所有和数组第一个数相等的数全部删掉才能保证:如果 nums[i] >= nums[0] 那么第 i 个数就在旋转点左侧这个性质。
1234567891011121314151617181920212223242526272829303132333435class Solution { public: bool search(vector<int>& nums, int target) { if (nums.empty()) return false; int r2 = nums.size() - 1; while (r2 >= 0 && nums[r2] == nums[0]) r2--; i ...
每日打卡-LeetCode-1006-笨阶乘
笨阶乘
表达式的计算一般可以借助数据结构「栈」完成。将暂时不能确定运算顺序的数据存入栈,确定优先级之后从栈中取出进行计算。
思路为:遇到乘除将栈顶元素取出与当前数运算,遇到加法将当前数入栈,遇到减法将当前数相反数入栈,最后将栈内元素累加就是最终答案。
12345678910111213141516171819202122232425262728class Solution { public: int clumsy(int N) { stack<int> stk; stk.push(N); N--; int i = 0; while (N > 0) { if (i % 4 == 0) { stk.top() *= N; } else if (i % 4 == 1) { stk.top() /= N; } else if (i % 4 == 2) { stk.push(N); ...
动态规划二
线性 DP
递推方程是有线性关系的。时间复杂度为状态数量乘以状态转移的计算量。
数字三角形
原题链接
如果下标涉及到 f[i-1],i 一般从 1 开始枚举,设定 f[0] 为边界值,避免一些 if 判断。
12345678910111213141516171819202122232425262728293031323334#include <iostream>using namespace std;const int N = 510, INF = 1e9;int n;int a[N][N], f[N][N];int main() { cin >> n; for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { cin >> a[i][j]; } } // 计算每行第一个数时,左上方的数不存在;计算每行最后一个数时,右上方的数不存在。都要初始化为负无穷。 for (int i = 0; i ...
增加服务器 swap 空间
检查服务器是否有 swap 空间
1$ free -m
创建 swap 文件
创建 swap 文件,2G 大小。总大小 = bs * count
1$ dd if=/dev/zero of=/mnt/swap bs=1M count=2048
设置交换分区
1$ mkswap /mnt/swap
启动 swap
1$ swapon /mnt/swap
设置开机自动启动 swap 空间
将以下内容添加到 /etc/fstab
1/mnt/swap swap swap defaults 0 0
ubuntu 服务器安装桌面环境
安装 Xfce 桌面环境
首先使用以下命令更新系统:
12$ sudo apt update$ sudo apt upgrade
Xfce 是轻量级的桌面,适合服务器安装。
1$ sudo apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils
安装 VNC 服务器
键入以下命令以在 Ubuntu 服务器上安装 TigerVNC :
1$ sudo apt install tigervnc-standalone-server tigervnc-common
配置 VNC 服务器
1$ vim ~/.vnc/xstartup
写入以下内容:
1234#!/bin/shunset SESSION_MANAGERunset DBUS_SESSION_BUS_ADDRESSexec startxfce4
保存并关闭文件。无论何时启动或重启 TigerVNC 服务器,都将自动执行上述命令。
~/.vnc/xstartup 文件还需要具有执行权限。运行以下命令以确保权限正确:
1$ chmod u+x ~/.vnc/xs ...