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! 阅读(85) 评论(0) 推荐(0) 编辑
摘要:这道题和经典的背包问题非常相似,但是和经典的背包问题只有一种容量不同,这道题有两种容量,即选取的字符串子集中的 01 的数量上限。 定义三维数组 dp,其中 dp[i][j][k] 表示在前 i 个字符串中,使用 \( 阅读全文
posted @ 2021-06-27 10:26 Dazzling! 阅读(31) 评论(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! 阅读(31) 评论(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][j1]。 \(f[i][j]\ 阅读全文
posted @ 2021-06-26 11:10 Dazzling! 阅读(26) 评论(0) 推荐(0) 编辑
摘要:定义二维数组 dp,其行数和列数都等于数组的长度,[i][j]表示当数组剩下的部分为下标 i 到下标 j 时,即在下标范围 [i,j] 中,当前玩家与另一个玩家的分数之差的最大值,注意当前玩家不一定是先手。 只有当 \(i \l 阅读全文
posted @ 2021-06-26 10:46 Dazzling! 阅读(28) 评论(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! 阅读(30) 评论(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! 阅读(76) 评论(0) 推荐(0) 编辑
摘要:暴力复杂度:O(n4) 前缀和优化:O(n3) 前缀和+二分优化:O(n2logn)) 动态规划:O(n2) 我们用 dp(i,j) 表示以 (i,j) 为右下角,且只包含 1 的正方形的边长最大值。如果我们能计 阅读全文
posted @ 2021-06-25 19:44 Dazzling! 阅读(78) 评论(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! 阅读(18) 评论(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! 阅读(22) 评论(0) 推荐(0) 编辑
摘要:创建一个哈希表,对于每一个 nums[i],我们首先查询哈希表中是否存在 targetnums[i],然后将 nums[i] 插入到哈希表中,即可保证不会让 nums[i] 和自己匹配。 class Solution { public: vector<int> 阅读全文
posted @ 2021-06-23 11:29 Dazzling! 阅读(21) 评论(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! 阅读(16) 评论(0) 推荐(0) 编辑
摘要:状态表示: f(i,j)ij划分总数。 状态转移: 考虑nm划分a_i(\sum_^ma_i=n): 如果对于每个i都有ai>0,那么ai1就对应了nmm划分。 如果存在ai=0,这就对应了nm1划分。 \[ 阅读全文
posted @ 2021-06-22 19:50 Dazzling! 阅读(88) 评论(0) 推荐(0) 编辑
摘要:借助前缀和,将二维的最大子矩阵转化为一维的最大子段和问题。 需要枚举最大子矩阵的首行和末行,内层循环每次都要求一遍最大子段和,时间复杂度为:O(n3) const int N = 110; int a[N][N]; int f[N][N]; int n; int main() { whil 阅读全文
posted @ 2021-06-22 17:32 Dazzling! 阅读(21) 评论(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! 阅读(46) 评论(0) 推荐(0) 编辑
摘要:在 DHCP 启动时,首先初始化 IP 地址池,将所有地址设置状态为未分配,占用者为空,并清零过期时刻。 其中地址的状态有未分配、待分配、占用、过期四种。 处于未分配状态的 IP 地址没有占用者,而其余三种状态的 IP 地址均有一名占用者。 处于待分配和占用状态的 IP 地址拥有一个大于零的过期时刻 阅读全文
posted @ 2021-06-22 12:52 Dazzling! 阅读(201) 评论(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! 阅读(1023) 评论(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! 阅读(60) 评论(0) 推荐(0) 编辑
摘要:枚举。每种饲料的份数取值为0100,时间复杂度为O(1013)。 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! 阅读(64) 评论(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! 阅读(103) 评论(0) 推荐(0) 编辑
摘要:解法一:小根堆 要得到从小到大的第 n 个丑数,可以使用最小堆实现。 初始时堆为空。首先将最小的丑数 1 加入堆。 每次取出堆顶元素 x,则 x 是堆中最小的丑数,由于 2x,3x,5x 也是丑数,因此将 2x,3x,5x 加入堆。 上述做法会 阅读全文
posted @ 2021-06-16 12:40 Dazzling! 阅读(34) 评论(0) 推荐(0) 编辑
摘要:状态表示: f(i,j):从前i张邮票中选,总面值恰好为j所需的最少邮票数。 状态转移: 按照完全背包的转移方式。 f(i,j)=min(f(i1,j),f(i,jvi)+1) 边界: f(0,0)=0 const int N = 2e6+10; in 阅读全文
posted @ 2021-06-16 09:38 Dazzling! 阅读(34) 评论(0) 推荐(0) 编辑
摘要:根据丑数的定义,0 和负整数一定不是丑数。 当 n>0 时,若 n 是丑数,则 n 可以写成 n=2a×3b×5c 的形式,其中 a,b,c 都是非负整数。特别地,当 a,b,c 都是 0 时,\(n=1\ 阅读全文
posted @ 2021-06-15 20:38 Dazzling! 阅读(42) 评论(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! 阅读(10) 评论(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! 阅读(31) 评论(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! 阅读(23) 评论(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! 阅读(17) 评论(0) 推荐(0) 编辑
摘要:状态表示: f(i)表示考虑前i个元素,且选第i个数的情况下, 最长上升子序列和的最大值。 状态转移: f(i)=max(f(i),f(j)+ai),aj<ai 边界: f(0)=0 注意点 f(i)初值设为ai,表示仅选定当前元素,最长上升 阅读全文
posted @ 2021-06-12 22:36 Dazzling! 阅读(87) 评论(0) 推荐(0) 编辑
摘要:状态可表示成6元祖的形式: (xcow,ycow,directioncow,xfarmer,yfarmer,directionfarmer) 由于每个状态每轮只会扩展出一个状态(即只有一种决策),就不需要借助队列来进行BFS了。 const i 阅读全文
posted @ 2021-06-09 16:43 Dazzling! 阅读(73) 评论(0) 推荐(0) 编辑
摘要:我们可以将所有类型 2 的操作安排在类型 1 的操作之前。因为类型 2 的操作是反转任意一个字符,而类型 1 的操作只会改变字符的相对顺序,不会改变字符的值。 当 n 是偶数时,交替字符串只可能为 010101 或者 \(1010 \cd 阅读全文
posted @ 2021-06-07 17:54 Dazzling! 阅读(203) 评论(0) 推荐(0) 编辑
摘要:首先,为了使得 nums 中所有元素相等,我们需要将 nums 中的任意元素都变为 nums 中的最小值。 其次,考虑 nums 中的任意元素 x,每次操作(如有)只能将它变成严格小于它的 阅读全文
posted @ 2021-06-07 09:40 Dazzling! 阅读(59) 评论(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! 阅读(63) 评论(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! 阅读(24) 评论(0) 推荐(0) 编辑
摘要:状态表示: f(i,j):节点数为i,高度不超过j的子树个数(定义成高度恰好为j不好计算)。 状态转移: 若左子树的节点数为k,则右子树的节点数为ik1。 \[ 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! 阅读(47) 评论(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! 阅读(22) 评论(0) 推荐(0) 编辑
摘要:枚举每次选择的三种运算符:{  ,+,}(字典序),时间复杂度为O(3),n9。 注意点 在数字1前加一个+方便表达式求值。 char path[10]; char op[]={' ','+','-'}; int n; bool check( 阅读全文
posted @ 2021-06-05 15:15 Dazzling! 阅读(52) 评论(0) 推荐(0) 编辑
摘要:状态表示: f(i):前缀s[1i]能否由子串集合中的元素表示。 f(i)只有truefalse两种取值。 状态转移: 对每个子串p[i],若s[i]大小为p[i]长度的后缀与p[i]匹配,则有如下转移: \[ f(i) \ |= f(i-p[i 阅读全文
posted @ 2021-06-04 15:28 Dazzling! 阅读(43) 评论(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! 阅读(34) 评论(0) 推荐(0) 编辑
摘要:罗马数字由 7 个不同的单字母符号组成,每个符号对应一个具体的数值。此外,减法规则(如问题描述中所述)给出了额外的 6 个复合符号。这给了我们总共 13 个独特的符号(每个符号由 1 个或 2 个字母组成),如下图所示。 我们用来确定罗马数字的规则是:对于罗马数字从左到右的每一位,选择尽可能大的符号 阅读全文
posted @ 2021-06-04 12:01 Dazzling! 阅读(53) 评论(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! 阅读(83) 评论(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! 阅读(24) 评论(0) 推荐(0) 编辑
摘要:暴力思路,不断累加当前数,判断是否为循环数: 每个数字位均不同 数字位不能有0 在所有数字上均停留一次后,回到出发点(最左边的数字),即每个数字位只能访问一次 bool used[10]; // 标记数字是否已使用 bool vis[10]; // 标记下标是否已访问 int m; bool i 阅读全文
posted @ 2021-06-03 16:58 Dazzling! 阅读(115) 评论(0) 推荐(0) 编辑
摘要:解法一:01背包 1n的总和sum=n(n+1)2,若将整数集合1n划分成两个和相等的子集,则子集的和sum=n(n+1)4。 问题转化为1n中选出若干个数,总和为sum的方案数。 const int 阅读全文
posted @ 2021-06-02 16:17 Dazzling! 阅读(131) 评论(0) 推荐(0) 编辑
摘要:在021中,从小到大搜索出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! 阅读(51) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示