06 2021 档案
摘要:注意到对一个数加不改变其奇偶性。 若所有数奇偶性相同,则对数组中某个数,可通过加操作使其变成数组中最大的数。若干次操作后可使整个数组中的元素的值相同。 const int N = 110; int a[N]; int n; int main() { int T; cin >> T; wh
阅读全文
摘要:这道题和经典的背包问题非常相似,但是和经典的背包问题只有一种容量不同,这道题有两种容量,即选取的字符串子集中的 和 的数量上限。 定义三维数组 ,其中 表示在前 个字符串中,使用 \(
阅读全文
摘要:二维费用背包。 状态表示: :从前首歌曲中选,当前已使用的唱片数为,且当前唱片的总时长不超过的情况下,能够选出的歌曲数的最大值。 状态转移: \[ f(i,j,k)=\begin{cases} f(i-1,j,k) & 不选第i首歌曲 \\ f(i-1,j.
阅读全文
摘要:定义二维数组 ,其行数和列数都等于数组的长度,表示当数组剩下的部分为下标 到下标 时,即在下标范围 中,当前玩家与另一个玩家的分数之差的最大值,注意当前玩家不一定是先手。 只有当 \(i \l
阅读全文
摘要:枚举求得各种边长的正方形的数目。 const int N = 255; char s[N][N]; int f[N][N]; int cnt[N]; int n; int main() { cin >> n; for(int i = 1; i <= n; i++) cin >> s[i] + 1;
阅读全文
摘要:本题和 221. 最大正方形 非常类似,使用的方法也几乎相同。 我们用 f[i][j] 表示以 (i, j) 为右下角的正方形的最大边长,那么除此定义之外,f[i][j] = x 也表示以 (i, j) 为右下角的正方形的数目为 x(即边长为 1, 2, ..., x 的正方形各一个)。在计算出所有
阅读全文
摘要:水题~。 注意点 需要一个临时变量存储原始的值。 class Solution { public: bool isPalindrome(int x) { if(x < 0) return false; long long res = 0; int t = x; while(x) { res =
阅读全文
摘要:模拟。 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x
阅读全文
摘要:创建一个哈希表,对于每一个 ,我们首先查询哈希表中是否存在 ,然后将 插入到哈希表中,即可保证不会让 和自己匹配。 class Solution { public: vector<int>
阅读全文
摘要:对满足条件的发票做一遍背包即可。 const int N = 3e6 + 10; int f[N]; int n; double m; void update(int v) { for(int j = m; j >= v; j--) f[j] = max(f[j], f[j - v] + v
阅读全文
摘要:借助前缀和,将二维的最大子矩阵转化为一维的最大子段和问题。 需要枚举最大子矩阵的首行和末行,内层循环每次都要求一遍最大子段和,时间复杂度为: const int N = 110; int a[N][N]; int f[N][N]; int n; int main() { whil
阅读全文
摘要:将棋盘编码成字符串,然后利用哈希表判重+记录距离。 char g[2][4]; unordered_map<string, int> dist; unordered_map<string, string> path; string st,ed; void put(string s) { for(in
阅读全文
摘要:在 DHCP 启动时,首先初始化 IP 地址池,将所有地址设置状态为未分配,占用者为空,并清零过期时刻。 其中地址的状态有未分配、待分配、占用、过期四种。 处于未分配状态的 IP 地址没有占用者,而其余三种状态的 IP 地址均有一名占用者。 处于待分配和占用状态的 IP 地址拥有一个大于零的过期时刻
阅读全文
摘要:二维前缀和。 const int N = 610; int g[N][N], sum[N][N]; int n,l,r,t; int main() { cin >> n >> l >> r >> t; for(int i = 1; i <= n; i++) for(int j = 1; j <= n
阅读全文
摘要:开个桶记录出现次数。 const int N = 260; int cnt[N]; int n,m,l; int main() { cin >> n >> m >> l; for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) { int x; c
阅读全文
摘要:枚举。每种饲料的份数取值为,时间复杂度为。 int g[3]; int a[3][3]; int main() { for(int i = 0; i < 3; i++) cin >> g[i]; if(g[0] + g[1] + g[2] == 0) pu
阅读全文
摘要:数字后面的0可以被10整除,或者等于2和5整除。此外,在一个阶乘中总是质因子2的个数多于5的个数。 为了得到阶乘的最后一位数,我们可以运行一个循环来计算阶乘模10的结果,但要出去质因子2或5。 最后,排除相同数量的2和5,从而忽略10,并乘以多余数目的质因子2。 int n; int main()
阅读全文
摘要:解法一:小根堆 要得到从小到大的第 个丑数,可以使用最小堆实现。 初始时堆为空。首先将最小的丑数 加入堆。 每次取出堆顶元素 ,则 是堆中最小的丑数,由于 也是丑数,因此将 加入堆。 上述做法会
阅读全文
摘要:完全背包裸题。 const int N = 10010; int f[N]; int n, m; int main() { cin >> m >> n; for(int i = 0; i < n; i++) { int score, time; cin >> score >> time; for(i
阅读全文
摘要:模板题,起点可选任意一个点。 const int N = 110; int g[N][N]; int dist[N]; bool vis[N]; int n; int prim() { memset(dist, 0x3f, sizeof dist); dist[0] = 0; int r
阅读全文
摘要:点数为,可以用求出其他点到终点的距离,选择到终点距离最小的点输出即可。 const int N = 55; int g[N][N]; int n=52,m; int get(char c) { if(isupper(c)) return c-'A'; return c-'a'+
阅读全文
摘要:3660. 最短时间 签到。 距离目标点最远的一定是四个顶点中的某一个点。 int n,m; int r,c; int main() { int T; cin>>T; while(T--) { cin>>n>>m>>r>>c; cout<<max(r-1,n-r)+max(c-1,m-
阅读全文
摘要:我们可以将所有类型 的操作安排在类型 的操作之前。因为类型 的操作是反转任意一个字符,而类型 的操作只会改变字符的相对顺序,不会改变字符的值。 当 是偶数时,交替字符串只可能为 或者 \(1010 \cd
阅读全文
摘要:模拟矩阵旋转,老套路题了。 class Solution { public: int n; void rotate(vector<vector<int>> &mat) { vector<vector<int>> temp(n,vector<int>(n)); for(int i=0;i<n
阅读全文
摘要:完全背包求方案数。 求体积恰好为、每种物品可选任意件的背包方案数。 const int N=30,M=10010; LL f[M]; int n,m; int main() { cin>>n>>m; f[0]=1; for(int i=1;i<=n;i++) { int v; cin>>v;
阅读全文
摘要:状态表示: :节点数为,高度不超过的子树个数(定义成高度恰好为不好计算)。 状态转移: 若左子树的节点数为,则右子树的节点数为。 \[ f(i,j)=\sum_{k=1}^{i-2} f(k,j-1) \times f(i-k-1,j-1)
阅读全文
摘要:3626. 三元一次方程 签到。 暴力思路是三重枚举,可优化至两重枚举。 int n; int main() { int T; cin>>T; while(T--) { cin>>n; bool ok=false; for(int i=0;3*i<=n && !ok;i++) for(int j=0
阅读全文
摘要:枚举每次选择的三种运算符:(字典序),时间复杂度为。 注意点 在数字前加一个方便表达式求值。 char path[10]; char op[]={' ','+','-'}; int n; bool check(
阅读全文
摘要:同12. 整数转罗马数字 pair<int,string> mp[]={ {1000, "M"}, {900, "CM"}, {500, "D"}, {400, "CD"}, {100, "C"}, {90, "XC"}, {50, "L"}, {40, "XL"}, {10, "X"}, {9,
阅读全文
摘要:罗马数字由 7 个不同的单字母符号组成,每个符号对应一个具体的数值。此外,减法规则(如问题描述中所述)给出了额外的 6 个复合符号。这给了我们总共 13 个独特的符号(每个符号由 1 个或 2 个字母组成),如下图所示。 我们用来确定罗马数字的规则是:对于罗马数字从左到右的每一位,选择尽可能大的符号
阅读全文
摘要:双指针维护长度为的区间内未选的数的和的最大值,之后再加上可选的数即可。 const int N=1e5+10; PII a[N]; int n,k; int main() { cin>>n>>k; for(int i=0;i<n;i++) cin>>a[i].fi; for(int i=0;i
阅读全文
摘要:双指针模板题。 string s; bool check(int cnt[]) { for(int i=1;i<=3;i++) if(cnt[i] == 0) return false; return true; } int main() { int T; cin>>T; while(T--) {
阅读全文
摘要:暴力思路,不断累加当前数,判断是否为循环数: 每个数字位均不同 数字位不能有 在所有数字上均停留一次后,回到出发点(最左边的数字),即每个数字位只能访问一次 bool used[10]; // 标记数字是否已使用 bool vis[10]; // 标记下标是否已访问 int m; bool i
阅读全文
摘要:在中,从小到大搜索出个满足任意两个编码之间码距大于等于的二进制编码。 const int N=70; int path[N]; int n,b,d; bool dfs(int u,int start) { if(u == n) { for(int i=0;i<n
阅读全文