摘要:
区间 dp:以区间为子问题的 dp。 特征: 从左往右 / 从右往左递推会得到不同结果; 常为 合并类 / 拆分类 / 处理两端类; 要么枚举中间断点,要么枚举两端点。 T1 令 \(dp_{i,j}\) 表示合并区间 \([i,j]\) 所需代价。易得答案为 \(dp_{1,n}\)。 初始状态即 阅读全文
摘要:
Problem T1 /* 思路: 统计每个人成绩的出现人次, 然后贪心地按分数值域从大到小扫描一遍, 每次令答案累加上当前分数出现的人次, 若答案>=k就停止扫描并输出即可。 */ #include<bits/stdc++.h> #define int long long using namesp 阅读全文
摘要:
Problem T1 /* 思路:令N个整数以字符串形式读入, 判断其末尾是否为0、2、4、6、8,若是则为偶数,不是则为奇数。 */ #include<bits/stdc++.h> using namespace std; int n; string x; //以字符串形式读入 int main( 阅读全文
摘要:
Problem T1 /* 思路:对于每一对L,R,标记[L,R)(注意左闭右开!), 并且求出最小的L(minl)和最大的R-1(maxr); 循环maxl~maxr,若被标记则最长连续挤奶时间+1,最长无人挤奶时间=0; 否则最长连续挤奶时间=0,最长无人挤奶时间+1,同时更新最大值。 */ # 阅读全文
摘要:
首先,我们很容易就能得出一个显而易见的结论: 若令原数组为 \(order\),\(K\) 个活跃位置分别为 \(A_1,A_2,...,A_K\),则 \[order_{A_1} \to order_{A_2},order_{A_2} \to order_{A_3},...,order_{A_K} 阅读全文
摘要:
Problem T1 /* 思路:枚举二元组(i,j),依次检验k次训练课,若i的位置总是>j或<j,则将答案累加。 */ #include<bits/stdc++.h> #define int long long using namespace std; int k,n,ans; int a[31 阅读全文
摘要:
Problem T1 /* 思路: 因为题目要求最大水量,所以K次操作需要都用上, 并且由于每次都是将x倒入x+1中,所以K次操作之后的最大水量应当是x~x+k+1之和; 于是问题就转变成了求一段长度为k+1的连续子段的和的最大值,因此维护一个前缀和即可。 */ #include<bits/stdc 阅读全文
摘要:
Problem T1 /* 思路: 我们可以忽略两人碰到后转向的过程,直接视为两人彼此穿过了对方, 这样算距离是不变的,时间也是不变的,所以合法。 通过上述分析, 那么最小时间即为对于每一个士兵往左/右走的时间取min再取max, 最大时间反之亦然。 */ #include<bits/stdc++. 阅读全文
摘要:
Problem T1 /* 思路: 暴力枚举所有的和,用桶标记每个和出现的次数,找最大值且编号最小即可。 */ #include<bits/stdc++.h> #define int long long using namespace std; int s1,s2,s3; int sum=-1e9, 阅读全文
该文被密码保护。 阅读全文
摘要:
Problem T1 /* 思路: 对于操作1,直接+=拼接即可; 对于操作2,直接令s=s.substr(a,b)即可; 对于操作3,直接令s=s.insert(a,t)即可; 对于操作4,直接s.find(str)即可,注意特判-1。 */ #include<bits/stdc++.h> #de 阅读全文
摘要:
思路 考虑将 \(id\) 从小到大排序, 然后从 \(2\) 下标开始扫描一遍 \(id\) 数组, 若当前的 \(id_i - id_{i-1} > 1\),则说明当前 \(id\) 存在断号,输出 \(id_i - 1\); 若当前的 \(id_i = id_{i-1}\),则说明当前 \(i 阅读全文
摘要:
我们令题目给出的排列为 \(p\),目标位置为 \(x\),待排序的区间为 \([l,r]\)。 则当且仅当 \(\sum_{l \le i \le r \ \text{且} \ p_i < p_x} p_i = x - l\) 时,\(p_x\) 在 \(p_{l \sim r}\) 排序后位置仍 阅读全文
摘要:
Problem T1 见题解。 T2 /* 思路: 枚举每一头牛说的话,尝试将Bessie置于pi处, 再枚举其他牛说的话,检验不合法的数量,取max即为答案。 */ #include<bits/stdc++.h> using namespace std; int n,ans=1e9; struct 阅读全文
摘要:
Problem T1 /* 思路: 遍历表达式s, 若当前字符是数字,直接赋值给:=左边的字母; 若当前字符是字母,则若其处于:=左边,记录接下来要赋值的字母; 否则,将当前字母的值赋值给:=左边的字母。 */ #include<bits/stdc++.h> #define int long lon 阅读全文
摘要:
题意: 对于一个初始全 \(0\) 的序列,问是否能够进行若干次操作(第 \(i\) 次操作为对序列中任意一个元素增加 \(k^i\)),使得此序列变为目标数组 \(a\)。 首先,我们令需要进行操作的序列为 \(b\)。 我们知道,如果能通过若干次操作将 \(b\) 变为 \(a\),则有以下三种 阅读全文
摘要:
本期讲解了进制转换。 T1 考验代码能力的好题。 首先需要判断输入的坐标是 RXCY 型还是 Excel 型: 直接扫一遍字符串,若存在一个字母前面是数字,则说明是 RXCY 型,否则是 Excel 型。 这一部分的代码: bool check(string s){ for(int i=0;s[i] 阅读全文
摘要:
本期主要讲解位运算。 一些 Trick 不要这样写: for(int i=0;i<=s.size()-1;i++) //do something here 因为如果 \(s\) 是空串,则 s.size() 返回 \(0\),\(0-1\) 应 \(=-1\),而因为 s.size() 是 \(\t 阅读全文
摘要:
本期讲解入门 \(dp\)。 知识点 \(dp\) 问题的特征: 可以通过对于子问题(与原问题结构相同但规模更小的问题)的求解来得出原问题的解。 无后效性(即对于当前问题的求解不会影响到其他问题的求解)。 \(dp\) 问题的求解过程: 我们令 \(dp\) 数组表示原问题的若干个子问题。 设计状态 阅读全文
摘要:
本期主要讲解 \(\text{LIS}\) 相关问题。 知识点 最长上升子序列 \(\text{LIS}\),是指在一个序列中任选若干个元素组成的单调递增的序列的最大长度。 求 \(\text{LIS}\) 的步骤: 定义状态:令 \(dp_i\) 表示以 \(i\) 结尾的 \(\text{LIS 阅读全文