自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(72)
  • 收藏
  • 关注

原创 蓝桥杯 完全平方数 刷题笔记

**继续除以3**:`1481441 ÷ 3 = 493813.666...`(无法整除)。- **继续除以3**:`13332969 ÷ 3 = 4444323`,次数 `s=2`。- **继续除以3**:`4444323 ÷ 3 = 1481441`,次数 `s=3`。- **计算**:`39998907 ÷ 3 = 13332969`,次数 `s=1`。- **各位和**:`3+9+9+9+8+9+0+7 = 54`,能被3整除。- `3` 的指数为 `3`(奇数),需乘一次 `3`。

2025-04-05 19:27:27 477

原创 蓝桥杯 统计子矩阵 刷题笔记

我来说一下这段代码的逻辑 ,通过累加 将 s[i][j] 处理成 第J列 第1-i 行的前缀和 ,外层i,j循环枚举了所有可能的起始行和结束行的组合 ,内层循环 让右指针作为矩阵的右边界 ,一步一步往右移动,而如果sum超过k 就让左边界右移,否则将当前结果加入res。,一步一步往右移动,而如果sum超过k 就让左边界右移,否则将当前结果加入res。计算的核心逻辑 ,通过累加 将。

2025-04-04 17:13:58 231

原创 蓝桥杯 岛屿个数 刷题笔记

对于3 不是子岛 我们发现 3 可以在搜到2 的上面时 斜着钻出去 这样就可以搜到边界了。3,bfs函数的i 只开到了四 检查四个方法 check函数i开到了8 检查八个方向。对于一个点 x,y 如果是陆地 放进去BFS并将该点连接的陆地设置成 已被遍历。如果是一个岛在往周围搜索的过程中没有被环包住 那么该岛是可以搜到边界的外海的。由于每个点都会搜索自己连接的陆地 所以再次被放入BFS的一定是一个新岛。一道BFS题 关键在于 联通块的判断 和 子岛的判定。所以我们在判断连通块时 搜四个方向。

2025-03-27 16:32:52 256

原创 P1825 [USACO11OPEN] Corn Maze S 刷题笔记

if(djzt[a[i][j]-65]==false){//如果该传送门没遇到过记录其坐标到dj数组。}else{//否则遇到过了将其坐标记录到对应djj数组。//djj数组作为第一个传送门的坐标数组。//dj数组作为第一个传送门的坐标数组。我们将传送门代表的字母-65就可以将其值映射到0-26。遇到多种情况判断不要全写进check里面。定义状态空间结构体精简代码。传送门是大写字母A-z。从而存下相应的传送门坐标。

2025-01-19 11:15:22 983

原创 洛谷 P1135 奇怪的电梯 刷题笔记 DFS

用一个状态数组来存到每个位置所用的最少步数。如果当前步数超出该最少步数 也不进行搜索。所以每个点都向上/向下 如果可以搜的话。但是我们要保证搜遍所有的路径。

2025-01-17 14:41:07 304

原创 洛谷 P1443 马的遍历 刷题笔记 BFS

不能用带两个int 的node结构体队列 否则内存会爆掉 2。一道搜索题 从第一个点一层一层往外搜索 即最少步数。拿出来 进行处理之后 将队头删掉 6。第一个点入队完成初始化 4。分析题目我们都知道马走日。画图定义出搜索的八个方向。

2025-01-17 11:32:31 1060

原创 洛谷 P2036 [COCI2008-2009 #2] PERKET 刷题笔记

/回溯成原来的酸度 不放该调料搜索下一层。//回溯成原来的苦度 不放该调料搜索下一层。分析一道搜索题 遍历每一种调料放或者不放。搜出绝对差最小的答案。

2025-01-16 14:53:03 279

原创 洛谷 P2392 kkksc03考前临时抱佛脚 刷题笔记 dfs

/Min函数内比较的是当前最短耗时 和max函数的结果。//取所有时间里的最小值。//max函数的结果是当前的实际耗时 即左右脑中耗时较长的一个。等所有的题目分配完毕直接比较两个脑子的总时间 取时间较长的作为答案。//将题目分配给左脑。if(step>a[x]){//当我们得到一个分配好的方案时。//分配下一道 题目。//记录每道题目的时间。//记录每科的题目数量。

2025-01-16 14:02:12 718

原创 洛谷 P1596 [USACO10OCT] Lake Counting S 刷题笔记

/有可能当前位置的水与前面搜索的水联通被记为了陆地 所以要先判断一下。//将四条边界标记为陆地。//确定当前是一块未被搜索过的 新 水。//如果下个位置为水且没有越界。观察 对于水来说 其八个方向相邻都属于同一个联通块。我们可以存水的位置 搜索每个水可以到达的所有位置。将搜过的位置标记为陆地避免重复搜索。一道判断有多少个联通块的问题。

2025-01-16 10:17:39 991

原创 洛谷 P1101 单词方阵刷题笔记

/用于检查答案的数组。if(b[i][j]==true){//如果有效输出原来位置的字母。//当前循环完毕所有条件均匹配 将沿途位置打上有效的标记。//有一个不匹配就退出当前循环。if(a[i][j]=='y'){//遍历检查y。如果有一个方向满足条件 就将该方向所有满足条件的位置打上有效标志。题目规定可以交叉可以共用 因为我们有效状态都是标记为true。//搜索该方向所有位置是否匹配。//搜索的八个方向的数组 搜索小技巧。

2025-01-15 23:34:49 1282

原创 洛谷P2404 自然数的拆分问题 刷题笔记 DFS

/如果当前要放在式子后面的数i小于前一个已经存好的数 则答案不合法 舍弃。//s被拆分掉了i 答案指针移动到下一位。如果一个数是奇数 分解成两个数相加 则第一个数是(n-1)/2 第二个数是n/2。if(s == 0){//s被减到0拆分完毕直接输出。a【0】记录的是第一个数 n/2下取整正好是(n-1)/2。注意观察答案的特点 得出判断合法答案的条件如何表述。观察答案特点 后面的数要比前面的数大。如果分解偶数则两个数均为n/2;所以i小于等于n/2。

2025-01-15 22:01:13 413

原创 采药 刷题笔记 (动态规划)0/1背包

当前行是考虑第i+1个物品的情况 当前行的最优解 来自上一行和前i个物品的最优解进行比较 如果当前装了当前物品(第i +1个物品) 的情况更优 则将当前行更新。//t 数组存采摘所需时间 v数组存草药价值。dp[i][j]表示 时间为j的情况下装前i个物品的最优解。上一行是考虑前i个物品的最优情况。0/1背包 的本质在于继承。否则直接从上一行进行继承。另一个0/1背包 供参考。

2024-12-03 23:14:32 432 1

原创 数星星 刷题笔记 (树状数组)

所以 我们在计算个数的时候是按照y一层层变大来遍历的。要求每个点 x, y 的左下方有多少个星星。当前的点有多少个点的x值比当前点小即可。又因为 是按照y从小到大 给出的。因此我们在处理每一个点的时候。树状数组的 操作模板。

2024-03-16 21:34:47 517

原创 P3374 【模板】树状数组 动态求连续区间和 刷题笔记

cout<<i<<"的二进制最后一位为"<<lowbit(i)<<endl;只需要三次操作 即可修改该元素 并且完成s[4] ,s[8],s[16]的前缀和的修改。//上述例子的s[4],s[8],s[16]至于想查看a[1-7]的和怎么办 此时只修改了s[4]并没有修改s[7]所以仍然完成了对a[1]+a[2]+...+a[7]的区间和的修改。并且我们上面提到 虽然我们只修改了s[3],s[4]我们想查询a[1]+a[2]+...+a[7]如图只需s[7]+s[6]+s[4]即可。

2024-03-16 15:25:36 873

原创 逆序对的数量 刷题笔记

划分到底层是四个数组 {4},{1},{3}, {2};此时左指针指向1 右边的2,3 都比1大 所以逆序对数量不改变。而这个数量计算关系公式为res += mid - i + 1;先合并{4} {1} 为{1,4};4>1 逆序对数量+1。在合并 {3},{2}为{ 2 ,3} 逆序对数量再+1;然后左指针++,指向4 右边有两个小于4 逆序对数量+2;然后我们再每次都 将res的数量更新到答案。将其合并成{1,2,3,4}即可整体有序。这样在每一层返回时 res的值都会被加回来。

2024-03-15 23:48:26 494

原创 移动距离 刷题笔记

于是我们加个特判 如果行号为奇数行号就将该行元素颠倒过来排序即可。只要知道了该元素除于w 的结果 就知道了其行号的奇偶性。正常排列下 我们直接将元素对宽度取余就可以获得列号。每一行的最后一个元素除于w的结果都比宽度+1;于是 每一行的元素除于w 的结果就跟其行号一致。n,m 两个数的坐标分标为。按正常数组的求法 (n/w)我们就知道该行应该如何排列。所求最短距离即曼哈顿距离。当我们想求两个数的行号时。依题意 给出两个数。

2024-03-14 20:28:01 688

原创 航班时间 刷题笔记

/前三个必定会读入,第四个仅当格式为(+t)时才会被读入,否则本次读入结束。总分钟数等于总秒数除以60;真正分钟数等于总分钟数对60取模;第一行第二个数据 是去的时候在B地降落的时间。只有当存在括号+%d时第四个数才会被读入。去的时候从A地出发到B地的起飞时间。总小时数等于 总分钟数/60。回程时到A地的降落时间。回程时在B地的起飞时间。第一行第一个给出的是。第二行的第一个数据是。

2024-03-14 19:45:32 608

原创 快速排序 刷题笔记

此时我们交换 q[i] ,q[j]于是小于x的数分到了小于x的一侧 大于x的数分到了大于x的一侧。当做完这整个while 循环 就会形成所有小于 x的数在x一侧 而大于x的数在另一侧。在这个基础上 我们 不断划分区间 调整每一个局部区间 的顺序 从而达到整体有序。每次这样做完就会找到q[i]>x,,,,q[j]小于x。两个指针从数组的两边向中间推进。在每个区间选定一个基准目标。

2024-03-13 22:55:58 495

原创 日期问题 刷题笔记

枚举 19600101 到20591231这个区间的数。补位写法“%02d" 如果不足两位则补零。关于题目给出的日期 有三种可能。判断 是否和题目给出的日期符合。获得年月日 判断是否合法。1.被4整除不被100整除。

2024-03-12 20:15:54 509

原创 归并排序 刷题笔记

条件 while(i<=mid&&j<=r)两个数列比较大小 小的一方 进入缓存数组。复制 回去修改q[]数组的值。将双序列扫入 缓存数组。

2024-03-11 20:59:19 461

原创 错误票据 刷题笔记

/ 忽略掉第一行的回车。3.先敲一个 getline(cin,line);从最小值开始 向上扫 当扫到a[x]==0时候为断号。初始化 一个字符串line。未知长度的数据的读入方式。扫到a[x]>1为重号;1.首先在头文件敲上。

2024-03-10 15:43:14 447

原创 递增三元组 刷题笔记

if (a[l] >= b[i]) //如果未找到小于b[i]的数,将x标记为-1,后续计算时 x+1==0。if (c[l] <= b[i]) //如果未找到大于b[i]的数,将y标记为n,后续计算时 n-y==0;//二分查找a数组中最后一个小于b[i]的数的下标。题意为 若存在 a中的数小于b中的数,b中的数小于c中的数 则该数算一种方案。从b到c的过程我们发现 第三层并不需要循环 直接加上 大于b的数量即可。往上a层找小于b的元素个数。

2024-03-10 11:50:25 490

原创 连号区间数 刷题笔记

例如 a数组假设为 3 1 2 5 4 6 7。设该段元素的最大值为max,最小值为min。2.题意为 单独截取数组中的一段元素。假设 取a[i]-a[j]这一段元素。如果该段元素重新排序后 是连续的则有。1.单个元素算一个连续区间。假设取 a[3]-a[5]重新排序后为 4 5 6。连续了 则ans++;符合条件则ans++;

2024-03-09 20:12:32 491

原创 波动数列 刷题笔记

思路分析dp找出状态转移方程设d为+a或者-b代码f[0][0]=1;i<n;i++){j<n;j++){return 0;

2024-03-09 16:08:10 510

原创 最长上升子序列 刷题笔记

dp 我们用f[i]来表示 a[i]可以构成的最长上升子序列。则f[j]=f[i]+1;加上a[j]这个元素长度加1。2.f[i]是小于a[j]里面的数之中子序列最长的。则a[j]所能形成的最长上升子序列的条件是。所以f[2]可以继承1 形成的最长子序列。所以我们需要将所有的f[i]初始化为1。因此 直接继承5的子序列且长度+1;前面没有比他小的数 f[1]=1;首先 一个数字就是长度为1的序列。其前面小于他且子序列最长的数是5。当指针来到a[j]这个数。1.a[j]大于前面的数。前面所有数已经算完固定。

2024-03-08 17:20:16 409

原创 摘花生 刷题笔记

即f[i][j]=max(f[i-1][j],f[i][j-1])+w[i][j];f[i][j]表示 当走到位置i,j时 所摘到的花生的最大值。因为每一次的选择都是基于左边和上边取得最大值。f[i-1][j]就是当前位置的左边花生数。所以 当前花生最大值只能来自左边或者上面。所以只需取左边和上面的花生数的最大值即可。f[i][j-1]则是上面的花生数。第i,j号位置的花生数 已经确定。开一个 f[N][N]数组。对于任意一个位置i,j。因为只能向东或者向南走。

2024-03-08 10:34:00 463

原创 01背包问题 刷题笔记

假设 此时j=5,v[i]=2, f[j-v[i]]+w[i]=11那么。用f[i][j]来表示当体积为j时 考虑前i件物品可以获得的 最大值。即 f[i-1][j]与f[i-1][j-v[i]]+w[i]比较。我们发现 考虑第i件物品时的最大值来自前面一层i-1件物品的最大值。则该体积 可以获得的最大值可以直接继承上一个f[i-1][j]也就是说 如果我们逆序更新的话 需要使用和比较的数是j-v[i]观察发现f[i][]是从f[i-1][]这一层更新出来的。比方说 前面已经进行了i件物品的选择。

2024-03-07 22:54:07 910

原创 饮料换购 刷题笔记

直接开个计数器mask。每当饮料现存数-1;

2024-03-07 18:01:52 436

原创 蚂蚁感冒 刷题笔记

但实际是反向 因此第一只向右走的感冒蚂蚁的位置实际是a[0]的位置。于是我们第二次搜索条件就是 位置在a[0]右边且向左走的蚂蚁。开始第一次遍历 找该蚂蚁左边是否存在可以被感冒的蚂蚁。并且 一旦这个向左走的蚂蚁遇到一个向右的蚂蚁。首先 我们获得第一个感冒蚂蚁的位置和方向。用来记录该蚂蚁左边是否存在向右走的蚂蚁。如果俩蚂蚁相向而行 则俩蚂蚁必定碰头。找该蚂蚁右边是否存在可以被感冒的蚂蚁。此时我们就获得了向右走的感冒蚂蚁。且该蚂蚁的左边存在向右走的蚂蚁。我们需要求最后感冒蚂蚁的数量。如果第一个蚂蚁向左走。

2024-03-07 17:30:36 777

原创 K倍区间 刷题笔记

s3和s0,s4和s0,s4和s3能构成三个k倍区间所以一共六个K倍区间。然后此时余数2已经出现三次 则让cnt[2]++;例如 余数2出现了两次 说明当前已经有两个s[l-1]对k取模余数为2。后面一旦出现当前余数2 就可以与这两个s[l-1]形成k倍区间。换句话说 s[i]和s[j-1]对k取模的余数是一样的。if((s[i]-s[j-1])%k==0)答案++;将其标记为出现三次 后面一旦再出出现余数2的s[r]法一 前缀和暴力搜索 (数据大会超时)法二 根据 式子推导。且s[0]%k=0;

2024-03-06 20:32:23 605

原创 四平方和 刷题笔记

用式子算出 a*a+b*b还剩下多少查找sum数组里面是否存在符合条件的数。当逼近答案后 检查一下是否为所需的数 如果是 直接输出。先枚举出 c*c+d*d并存入数组。直接暴力搜索 可能会超时。查找方式使用二分搜索。

2024-03-05 22:00:30 464

原创 激光炸弹 刷题笔记

一个个矩阵搜索 符合要求边长 矩阵中的元素和最大值。将x1,y1用i-k,j-k表示即可。将子矩阵的和 做成动态矩阵。思路 参考二维前缀和。x2,y2用i,j表示。前置知识 二维前缀和。

2024-03-05 21:02:43 570

原创 分巧克力 刷题笔记

因为c++里面的除法是下取整的所以我们不用考虑奇偶数 是否能整除。将每一块巧克力能分成的k*k的巧克力块数加上计数器。则答案>=mid 所以我们让l=mid。如果check 不通过的话 可能是分的太大了。于是 我们让mid=(l+r+1)>>1。对于一块边长分别为x 和y的巧克力\\。其能分割成的 k*k 的巧克力的块数为。如果还是l=mid=2则陷入死循环。假设我们输入检查的数为k。于是我们让r=mid-1。此时 r=mid-1=l;当 l指向2 r指向3。但是l=2,r=3;

2024-03-04 22:31:15 542

原创 子矩阵的和 刷题笔记 {二维前缀和}

所以式子为 s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1];加上s[i-1][j]和s[i][j-1]后 s[i-1][j-1]部分重复了所以减去。首先我们的目标是让 s[i][j]表示为其左方和上方形成的矩阵所有元素的和。最后加回去重复减去的s[x1-1][y1-1]即可。将是s[x2][y2]圈成的大正方形里面扣掉这两块。即s[x2][y1-1]和s[x1-1][y2]我们利用刚刚处理好的s[i][j]来操作。最后加上a[i][j]即可完成目标。

2024-03-03 16:08:15 458

原创 前缀和 刷题笔记

第n项和等于 前n-1项和加上当前项。关键在于 构造前缀和数组。

2024-03-03 12:08:15 439

原创 数的三次方根 刷题笔记

思路 二分确定精度 逼近答案int mask=0;cin>>n;l=mid;}else{r=mid;return 0;另一道二分题。

2024-03-03 11:40:27 544

原创 数的范围 刷题笔记

a[mid]=x,让l=mid=3,并未发生改变 陷入了死循环。a[mid]>=x,答案在mid处 或者在mid的左边。说明答案在mid 处或者在mid 的右边。因此我们在找右端点要+1 让mid上取整。此时a[3]=x,让r=mid=3;当我们寻找第一个大于等于x的数时。例如 当l指向3,r指向4,;定义一个左指针和一个右指针。因此让r=mid继续逼近。且3为左端点 4为右端点。此时 让l=mid=4;因此让l=mid+1;当a[mid]<=x;否则让r=mid-1;关键点在于讨论特殊情况。

2024-03-02 23:22:14 421

原创 翻硬币 刷题笔记

/存下前一个不一样位置的下标。//用cnt计下不一样的地方数。//两两一组 进行操作。只需要后面的下标减去前面的下标即可获得操作次数。每两处不一样的地方,我们想改变其状态。此时我们只改变了硬币5和硬币8的状态。所以我们检查读入和目标不一样的地方。按一下会改变相邻两个硬币的状态。从对位置下标为5到下标为7。依次翻其本身和其右边的硬币。通过模拟观察 我们发现。两两一组进行操作 即可。

2024-03-02 18:12:04 814

原创 116. 飞行员兄弟 刷题笔记

/备份 便于修改后的复原。turn_(i,j);//get函数将二维位置 转为二进制的位数第几位。//答案从 开始数 所以加 1。对该位与上1 如果成立则该改变改行该列的状态。//检查操作完后是否满足条件。//每次之会切换七个 把手的状态。将i j转化为当前二进制的位数。//换单个把手的状态。1.将0-2^16-1。

2024-03-02 17:37:25 486

原创 1209. 带分数 刷题笔记

/计算当前排列是否匹配目标值。//修改num内存的值与当前排列相同。由此 我们可以搜出123456789的全部排列方式。//当u>9说明已经搜索出了一个排列。//双循环 枚举出所有的分法。//将num的值转化为a,b,c的值。依题意 a,b,c三个数由1-9九个数字组成。获得a=985,b=476,c=321;例如 a=12,b=4567,c=89。转换为 c*n==a*c+b。看n是否与a+b/c相等。我们将 n==a+b/c。那么如何获得a,b,c。且每个数字只能出现一次。同时与目标值匹配即可。

2024-03-01 23:27:37 464

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除