06 2021 档案

摘要:注意到对一个数加$2$不改变其奇偶性。 若所有数奇偶性相同,则对数组中某个数,可通过加$2$操作使其变成数组中最大的数。若干次操作后可使整个数组中的元素的值相同。 const int N = 110; int a[N]; int n; int main() { int T; cin >> T; wh 阅读全文
posted @ 2021-06-28 11:50 Dazzling! 阅读(120) 评论(0) 推荐(0)
摘要:这道题和经典的背包问题非常相似,但是和经典的背包问题只有一种容量不同,这道题有两种容量,即选取的字符串子集中的 \(0\) 和 \(1\) 的数量上限。 定义三维数组 \(\textit{dp}\),其中 \(\textit{dp}[i][j][k]\) 表示在前 \(i\) 个字符串中,使用 \( 阅读全文
posted @ 2021-06-27 10:26 Dazzling! 阅读(54) 评论(0) 推荐(0)
摘要:二维费用背包。 状态表示: \(f(i,j,k)\):从前$i$首歌曲中选,当前已使用的唱片数为$j$,且当前唱片的总时长不超过$k$的情况下,能够选出的歌曲数的最大值。 状态转移: \[ f(i,j,k)=\begin{cases} f(i-1,j,k) & 不选第i首歌曲 \\ f(i-1,j. 阅读全文
posted @ 2021-06-26 17:48 Dazzling! 阅读(55) 评论(0) 推荐(0)
摘要:状态表示: \(f[i][j]\) 表示在区间 \([i,j]\) 时,先手和后手的最大差值得分。 状态转移: 当取 \(w[i]\) 时,\(f[i][j]=w[i]−f[i+1][j]\)。 当取 \(w[j]\) 时,\(f[i][j]=w[j]−f[i][j−1]\)。 \(f[i][j]\ 阅读全文
posted @ 2021-06-26 11:10 Dazzling! 阅读(63) 评论(0) 推荐(0)
摘要:定义二维数组 \(\textit{dp}\),其行数和列数都等于数组的长度,$\textit[i][j] $表示当数组剩下的部分为下标 \(i\) 到下标 \(j\) 时,即在下标范围 \([i, j]\) 中,当前玩家与另一个玩家的分数之差的最大值,注意当前玩家不一定是先手。 只有当 \(i \l 阅读全文
posted @ 2021-06-26 10:46 Dazzling! 阅读(52) 评论(0) 推荐(0)
摘要:枚举求得各种边长的正方形的数目。 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; 阅读全文
posted @ 2021-06-25 21:09 Dazzling! 阅读(53) 评论(0) 推荐(0)
摘要:本题和 221. 最大正方形 非常类似,使用的方法也几乎相同。 我们用 f[i][j] 表示以 (i, j) 为右下角的正方形的最大边长,那么除此定义之外,f[i][j] = x 也表示以 (i, j) 为右下角的正方形的数目为 x(即边长为 1, 2, ..., x 的正方形各一个)。在计算出所有 阅读全文
posted @ 2021-06-25 20:12 Dazzling! 阅读(113) 评论(0) 推荐(0)
摘要:暴力复杂度:\(O(n^4)\) 前缀和优化:\(O(n^3)\) 前缀和+二分优化:\(O(n^2\log n))\) 动态规划:\(O(n^2)\) 我们用 \(\textit{dp}(i, j)\) 表示以 \((i,j)\) 为右下角,且只包含 \(1\) 的正方形的边长最大值。如果我们能计 阅读全文
posted @ 2021-06-25 19:44 Dazzling! 阅读(113) 评论(0) 推荐(0)
摘要:水题~。 注意点 需要一个临时变量存储$x$原始的值。 class Solution { public: bool isPalindrome(int x) { if(x < 0) return false; long long res = 0; int t = x; while(x) { res = 阅读全文
posted @ 2021-06-25 08:50 Dazzling! 阅读(42) 评论(0) 推荐(0)
摘要:模拟。 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x 阅读全文
posted @ 2021-06-23 11:42 Dazzling! 阅读(54) 评论(0) 推荐(0)
摘要:创建一个哈希表,对于每一个 \(nums[i]\),我们首先查询哈希表中是否存在 \(target - nums[i]\),然后将 \(nums[i]\) 插入到哈希表中,即可保证不会让 \(nums[i]\) 和自己匹配。 class Solution { public: vector<int> 阅读全文
posted @ 2021-06-23 11:29 Dazzling! 阅读(40) 评论(0) 推荐(0)
摘要:对满足条件的发票做一遍$01$背包即可。 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 阅读全文
posted @ 2021-06-22 23:38 Dazzling! 阅读(25) 评论(0) 推荐(0)
摘要:状态表示: \(f(i,j)\):$i$的$j$划分总数。 状态转移: 考虑$n$的$m$划分$a_i(\sum_^ma_i=n$): 如果对于每个$i$都有$a_i > 0$,那么${a_i-1}$就对应了$n-m$的$m$划分。 如果存在$a_i=0$,这就对应了$n$的$m-1$划分。 \[ 阅读全文
posted @ 2021-06-22 19:50 Dazzling! 阅读(105) 评论(0) 推荐(0)
摘要:借助前缀和,将二维的最大子矩阵转化为一维的最大子段和问题。 需要枚举最大子矩阵的首行和末行,内层循环每次都要求一遍最大子段和,时间复杂度为:\(O(n^3)\) const int N = 110; int a[N][N]; int f[N][N]; int n; int main() { whil 阅读全文
posted @ 2021-06-22 17:32 Dazzling! 阅读(33) 评论(0) 推荐(0)
摘要:将棋盘编码成字符串,然后利用哈希表判重+记录距离。 char g[2][4]; unordered_map<string, int> dist; unordered_map<string, string> path; string st,ed; void put(string s) { for(in 阅读全文
posted @ 2021-06-22 16:39 Dazzling! 阅读(78) 评论(0) 推荐(0)
摘要:在 DHCP 启动时,首先初始化 IP 地址池,将所有地址设置状态为未分配,占用者为空,并清零过期时刻。 其中地址的状态有未分配、待分配、占用、过期四种。 处于未分配状态的 IP 地址没有占用者,而其余三种状态的 IP 地址均有一名占用者。 处于待分配和占用状态的 IP 地址拥有一个大于零的过期时刻 阅读全文
posted @ 2021-06-22 12:52 Dazzling! 阅读(227) 评论(0) 推荐(1)
摘要:二维前缀和。 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 阅读全文
posted @ 2021-06-20 19:20 Dazzling! 阅读(1046) 评论(0) 推荐(0)
摘要:开个桶记录出现次数。 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 阅读全文
posted @ 2021-06-20 18:59 Dazzling! 阅读(77) 评论(0) 推荐(0)
摘要:枚举。每种饲料的份数取值为$0 \sim 100$,时间复杂度为$O(101^3)$。 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 阅读全文
posted @ 2021-06-17 23:21 Dazzling! 阅读(101) 评论(0) 推荐(0)
摘要:数字后面的0可以被10整除,或者等于2和5整除。此外,在一个阶乘中总是质因子2的个数多于5的个数。 为了得到阶乘的最后一位数,我们可以运行一个循环来计算阶乘模10的结果,但要出去质因子2或5。 最后,排除相同数量的2和5,从而忽略10,并乘以多余数目的质因子2。 int n; int main() 阅读全文
posted @ 2021-06-16 13:17 Dazzling! 阅读(147) 评论(0) 推荐(0)
摘要:解法一:小根堆 要得到从小到大的第 \(n\) 个丑数,可以使用最小堆实现。 初始时堆为空。首先将最小的丑数 \(1\) 加入堆。 每次取出堆顶元素 \(x\),则 \(x\) 是堆中最小的丑数,由于 \(2x, 3x, 5x\) 也是丑数,因此将 \(2x, 3x, 5x\) 加入堆。 上述做法会 阅读全文
posted @ 2021-06-16 12:40 Dazzling! 阅读(76) 评论(0) 推荐(0)
摘要:状态表示: \(f(i,j)\):从前$i$张邮票中选,总面值恰好为$j$所需的最少邮票数。 状态转移: 按照完全背包的转移方式。 \[ f(i,j)=\min(f(i-1,j),f(i,j-v_i)+1) \] 边界: \[ f(0,0)=0 \] const int N = 2e6+10; in 阅读全文
posted @ 2021-06-16 09:38 Dazzling! 阅读(58) 评论(0) 推荐(0)
摘要:根据丑数的定义,0 和负整数一定不是丑数。 当 \(n>0\) 时,若 \(n\) 是丑数,则 \(n\) 可以写成 \(n = 2^a \times 3^b \times 5^c\) 的形式,其中 \(a,b,c\) 都是非负整数。特别地,当 \(a,b,c\) 都是 \(0\) 时,\(n=1\ 阅读全文
posted @ 2021-06-15 20:38 Dazzling! 阅读(69) 评论(0) 推荐(0)
摘要:完全背包裸题。 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 阅读全文
posted @ 2021-06-15 19:10 Dazzling! 阅读(29) 评论(0) 推荐(0)
摘要:$prim$模板题,起点可选任意一个点。 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 阅读全文
posted @ 2021-06-15 19:08 Dazzling! 阅读(41) 评论(0) 推荐(0)
摘要:点数为$52$,可以用$floyd$求出其他点到终点的距离,选择到终点距离最小的点输出即可。 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'+ 阅读全文
posted @ 2021-06-14 11:15 Dazzling! 阅读(60) 评论(0) 推荐(0)
摘要:3660. 最短时间 签到。 距离目标点$(r,c)$最远的一定是四个顶点中的某一个点。 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- 阅读全文
posted @ 2021-06-13 15:14 Dazzling! 阅读(38) 评论(0) 推荐(0)
摘要:状态表示: $f(i)$表示考虑前$i$个元素,且选第$i$个数的情况下, 最长上升子序列和的最大值。 状态转移: \[ f(i)=\max(f(i),f(j)+a_i),a_j < a_i \] 边界: \[ f(0)=0 \] 注意点 $f(i)$初值设为$a_i$,表示仅选定当前元素,最长上升 阅读全文
posted @ 2021-06-12 22:36 Dazzling! 阅读(120) 评论(0) 推荐(0)
摘要:状态可表示成$6$元祖的形式: \[ (x_{cow},y_{cow},direction_{cow},x_{farmer},y_{farmer},direction_{farmer}) \] 由于每个状态每轮只会扩展出一个状态(即只有一种决策),就不需要借助队列来进行$BFS$了。 const i 阅读全文
posted @ 2021-06-09 16:43 Dazzling! 阅读(108) 评论(0) 推荐(0)
摘要:我们可以将所有类型 \(2\) 的操作安排在类型 \(1\) 的操作之前。因为类型 \(2\) 的操作是反转任意一个字符,而类型 \(1\) 的操作只会改变字符的相对顺序,不会改变字符的值。 当 \(n\) 是偶数时,交替字符串只可能为 \(0101\cdots 01\) 或者 \(1010 \cd 阅读全文
posted @ 2021-06-07 17:54 Dazzling! 阅读(282) 评论(0) 推荐(0)
摘要:首先,为了使得 \(\textit{nums}\) 中所有元素相等,我们需要将 \(\textit{nums}\) 中的任意元素都变为 \(\textit{nums}\) 中的最小值。 其次,考虑 \(\textit{nums}\) 中的任意元素 \(x\),每次操作(如有)只能将它变成严格小于它的 阅读全文
posted @ 2021-06-07 09:40 Dazzling! 阅读(97) 评论(0) 推荐(0)
摘要:模拟矩阵旋转$90°$,老套路题了。 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 阅读全文
posted @ 2021-06-06 23:28 Dazzling! 阅读(87) 评论(0) 推荐(0)
摘要:完全背包求方案数。 求体积恰好为$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; 阅读全文
posted @ 2021-06-06 16:53 Dazzling! 阅读(54) 评论(0) 推荐(0)
摘要:状态表示: \(f(i,j)\):节点数为$i$,高度不超过$j$的子树个数(定义成高度恰好为$j$不好计算)。 状态转移: 若左子树的节点数为$k$,则右子树的节点数为$i-k-1$。 \[ f(i,j)=\sum_{k=1}^{i-2} f(k,j-1) \times f(i-k-1,j-1) 阅读全文
posted @ 2021-06-06 16:25 Dazzling! 阅读(76) 评论(0) 推荐(0)
摘要: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 阅读全文
posted @ 2021-06-06 12:35 Dazzling! 阅读(32) 评论(0) 推荐(0)
摘要:枚举每次选择的三种运算符:\(\{'\ \ ','+','-'\}\)(字典序),时间复杂度为$O(3^),n \le 9$。 注意点 在数字$1$前加一个$'+'$方便表达式求值。 char path[10]; char op[]={' ','+','-'}; int n; bool check( 阅读全文
posted @ 2021-06-05 15:15 Dazzling! 阅读(82) 评论(0) 推荐(0)
摘要:状态表示: \(f(i)\):前缀$s[1 \sim i]$能否由子串集合中的元素表示。 $f(i)$只有$true$和$false$两种取值。 状态转移: 对每个子串$p[i]$,若$s[i]$大小为$p[i]$长度的后缀与$p[i]$匹配,则有如下转移: \[ f(i) \ |= f(i-p[i 阅读全文
posted @ 2021-06-04 15:28 Dazzling! 阅读(66) 评论(0) 推荐(0)
摘要:同12. 整数转罗马数字 pair<int,string> mp[]={ {1000, "M"}, {900, "CM"}, {500, "D"}, {400, "CD"}, {100, "C"}, {90, "XC"}, {50, "L"}, {40, "XL"}, {10, "X"}, {9, 阅读全文
posted @ 2021-06-04 14:15 Dazzling! 阅读(74) 评论(0) 推荐(0)
摘要:罗马数字由 7 个不同的单字母符号组成,每个符号对应一个具体的数值。此外,减法规则(如问题描述中所述)给出了额外的 6 个复合符号。这给了我们总共 13 个独特的符号(每个符号由 1 个或 2 个字母组成),如下图所示。 我们用来确定罗马数字的规则是:对于罗马数字从左到右的每一位,选择尽可能大的符号 阅读全文
posted @ 2021-06-04 12:01 Dazzling! 阅读(87) 评论(0) 推荐(0)
摘要:双指针维护长度为$k$的区间内未选的数的和的最大值,之后再加上可选的数即可。 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 阅读全文
posted @ 2021-06-04 10:59 Dazzling! 阅读(115) 评论(0) 推荐(0)
摘要:双指针模板题。 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--) { 阅读全文
posted @ 2021-06-03 23:58 Dazzling! 阅读(61) 评论(0) 推荐(0)
摘要:暴力思路,不断累加当前数,判断是否为循环数: 每个数字位均不同 数字位不能有$0$ 在所有数字上均停留一次后,回到出发点(最左边的数字),即每个数字位只能访问一次 bool used[10]; // 标记数字是否已使用 bool vis[10]; // 标记下标是否已访问 int m; bool i 阅读全文
posted @ 2021-06-03 16:58 Dazzling! 阅读(153) 评论(0) 推荐(0)
摘要:解法一:01背包 $1 \sim n$的总和$sum=\frac{n(n+1)}{2}$,若将整数集合$1 \sim n$划分成两个和相等的子集,则子集的和$sum'=\frac{n(n+1)}{4}$。 问题转化为$1 \sim n$中选出若干个数,总和为$sum'$的方案数。 const int 阅读全文
posted @ 2021-06-02 16:17 Dazzling! 阅读(162) 评论(0) 推荐(0)
摘要:在$0 \sim 2^-1$中,从小到大搜索出$n$个满足任意两个编码之间码距大于等于$d$的二进制编码。 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 阅读全文
posted @ 2021-06-01 19:21 Dazzling! 阅读(83) 评论(0) 推荐(0)