每日一题
加贺百万石
这个作者很懒,什么都没留下…
展开
-
AcWing 143 最大异或对(Trie)
链接: link.用Trie(字典树),建树时,根据每个数字的对应的二进制串构造一个二叉树,每个结点两个分支,分支指向的两个son结点分别表示当前位的数值为0或1,记录每次输入的数字转化成的二进制串,当前位为1,就走到数值为1的结点,否则走到0结点,这样每个数字对应的Trie中的路径就是唯一的。因为要求异或值最大,所以用贪心的思想,在第一个数字固定的情况下,尽可能地让第二个数的每一位都与第一个数的对应位相反,这样最终确定的第二个数与第一个数的异或值就最大,所以在查询时,根据固定的第一个二进制串,每次尽可能原创 2021-02-12 19:10:02 · 117 阅读 · 1 评论 -
AcWing 1613 数独简单版
链接: link.数据比较小,我们直接采取暴力的搜索方式。从左上角(0,0)开始:1.如果当前格子是 ‘ . ’,我们就按照行,列,3*3九宫格判断我们可以填什么数字,然后搜索所有能填的数字。2.如果当前格子是数字,我们直接跳过。当进行完每一层搜索:1.如果当前行不是最后一行,我们就跳到下一行。2.如果当前行是最后一行,我们直接返回。代码实现#include <bits/stdc++.h>using namespace std;const int N = 10;char g[原创 2021-02-12 18:42:25 · 132 阅读 · 0 评论 -
AcWing479 加分二叉树(区间dp)
链接: link.这道题我们根据题意,要我们求得二叉树最大的加分,并输出字典序最小的方案。貌似是对二叉树的考察,但并不是,我们需要用区间dp解决这道题。首先我们看一下什么是区间dp区间dp区间dp 是一种建立在线性结构上的对区间的动态规划,求解一段区间上的最优解。区间dp 我们一般是将大区间转化成小区间,然后对每个小区间求最优解,进而得到大区间的最优解。区间dp问题和背包问题一样是有模板的,模板有三要素:区间长度,区间起点和终点,分割下面我们看一下模板for(int len=1;len&原创 2021-02-01 15:20:05 · 154 阅读 · 0 评论 -
AcWing 1402 星空之夜(Flood Fill 算法)
链接: link.首先根据题意,我们应该先找出所有连通块,这里我们用到的是Flood Fill 算法。然后我们要判断两连通块形状是否相同(通过旋转或对称可以使连通块变到重合)。这里我们采用哈希存储下不同形状的连通块。我们要保证形状形同的连通块映射到同一个数,且尽量避免冲突。这里我们采用两两之间的欧几里得距离作为哈希函数。Flood Fill 模板BFS模板void bfs(int a,int b){ queue<PAIR> q; st[a][b] = true;原创 2021-01-30 16:40:21 · 137 阅读 · 0 评论 -
AcWing 1381 阶乘
链接: link.首先n的范围是(1,1000),所以暴力是一定不行的。我们可以进行以下操作避免超范围。1.不断去除末尾的0,也就是不断除10,直到最后一位非零。(非零位后面的0对之后的阶乘没有影响)。2.每次都对1e9取模,控制数据范围。#include <bits/stdc++.h>using namespace std;const int mod = 1e9;int main(){ int n; cin>>n; long long原创 2021-04-05 20:37:17 · 102 阅读 · 0 评论 -
LeetCode 74. 搜索二维矩阵
链接: link.本题我们可以用两种方法做。双指针法因为矩阵是从左到右递增,从上倒下递增,所以一开始我们选中右上角的位置,根据当前位置的值和key值的大小挪动我们的指针,直到找到key值或者找完所有满足条件的位置。class Solution {public: bool searchMatrix(vector<vector<int>>& matrix, int target) { if(matrix.empty()||matrix[0].em原创 2021-03-30 18:44:01 · 78 阅读 · 0 评论