首页 > 编程语言 >基础算法思想与搜索枚举

基础算法思想与搜索枚举

时间:2023-07-27 10:12:51浏览次数:39  
标签:int 算法 mid vis 枚举 搜索 bs 例题

位运算

常用运算符

  • 按位与 &
  • 按位或 |
  • 按位异或 ^
  • 取反 ~
  • 左移 <<
  • 右移 >>
  • 非负整数原码反码补码都一样!
  • 运算符优先级不清楚就打括号!
  • C++运算符优先级

应用场景

  • 用二进制位表示元素的存在情况
  • 题目要求进行位运算
  • 获取二进制的某一位
int getBit(int a, int b) {
    return (a >> b) & 1;
}
  • 将一个数二进制某一位设为 0/1/取反
int unsetBit(int a, int b) {
    return a & ~(1 << b);
}
int setBit(int a, int b) {
    return a | (1 << b);
}
int flapBit(int a, int b) {
    return a * (1 << b);
}

std::bitset

  • 存储 \(0/1\) 的大小不可变的容器 bitset<SIZE> bs;
  • bs.count() 返回 \(1\) 的个数
  • bs.size() 返回 bs 的位数
  • bs.any() 返回是否有 \(1\)
  • bs.none() 返回是否全部为 \(0\)
  • bs.all() 返回是否全部为 \(1\)
  • bs.reset(x) x 为 \(0\) 或 \(1\),将 bs 中元素全部设为 x
  • operator[]==!=支持位运算!

位运算例题

搜索

暴力枚举所有方案(深度优先搜索)

void dfs(int n, ...) {
    if (所有状态均枚举完成) {
       ...
       return; // 一定要返回
    }
    for (遍历当前状态所有扩展可能性) {
        if (判断扩展状态是否合法) {
            调整状态
            dfs(n + 1, ...); // 向深层递归搜索
            复原状态(一定要回溯!!)
        }
    }
}

图上的深度优先遍历(用 vis 数组跳过已经走过的点)

void dfs(int u) { // 当前的位置(节点)
    vis[u] = 1;
    for (与 u 相邻的节点 v) {
        if (!vis[v]) dfs(v);
    }
}
dfs(s); // 从起点开始

图上的广度优先遍历(使用队列)

void bfs() {
    queue<T> q;
    q.push(s); // 起点入队
    vis[s] = 1;
    while (!q.empty()) {
        T u = q.front();
        q.pop();
        for (与 u 相邻的节点 v) {
            if (!vis[v]) {
                q.push(v);
                vis[v] = 1; // 必须在此处标记,避免某节点多次入队
            }
        }
    }
}

暴力搜索例题

图上的深度、广度遍历例题

搜索拓展-记忆化搜索

  • 注意:一定要满足无后效性!!
  • 搜索时进行缓存,对于缓存中已经存在的数据直接返回
  • 例题:P1434 滑雪

搜索拓展-剪枝

  • 最优性剪枝:如果当前方案已经比目前最优解更差,直接停止
  • 可行性剪枝:如果当前方案不可用,直接停止
  • 例题:B3624 猫粮规划

贪心

二分

二分查找

  • 在一个 有序!! 序列中查找某一元素的算法(\(O(logn)\)),每次将搜索范围缩小一半
  • 例题:P1947 猜数(交互题)

二分答案模板

题目答案特点:具有有界性、单调性!!

直接求解难,但是判定某解是否符合题意相对容易!

int binary_search(int L, int R, int k) {
    int l = L, r = R, ans = -1;
    while (l <= r) { // 必须写 l <= r!!!
        int mid = (l + r) >> 1;
        if (check(mid)) { // 自己写 check 函数
            把 mid 以某种方式赋值给 ans
            l = mid + 1; 或 r = mid - 1;
        } else {
            l = mid + 1; 或 r = mid - 1;
        }
    }
    return ans;
}

前缀和

  • 一种重要的预处理方式,大大降低查询的时间复杂度
  • 一维前缀和:\(f_i = f_{i-1} + a_i\)
  • 二维前缀和:\(f[i][j] = f[i-1][j] + f[i][j-1] - f[i-1][j-1] + a[i][j]\)
  • 多维前缀和:使用容斥原理解决
  • 查询 \([i,j]\) 的区间和:\(f_j - f_{i-1}\)

差分

  • 前缀和的逆运算
  • 主要作用:多次修改、一次查询(单点修改,区间查询)
  • 使用差分:f[l] += xf[r += 1] - x:把区间 \([l,r]\) 内所有的数字都加上 \(x\)

双指针

  • 同时使用两个指针
  • 利用区间有序性
  • 维护区间信息
  • 快慢指针:在单链表中找环
    • 跑步套圈,一个指针一次走一步,一个指针一次走两步
    • 两个指针相遇后,将其中一个移到表头,让两者都一步一步走,再度相遇的位置就是环的起点
  • 例题:P1102 A-B数对
  • 例题:P1147 连续自然数和

完结撒花!

标签:int,算法,mid,vis,枚举,搜索,bs,例题
From: https://www.cnblogs.com/winter-tide/p/17584186.html

相关文章

  • 纪念我的算法竞赛生涯
    纪念我的算法竞赛生涯三年时间,白驹过隙。三年前一眼望不到尽头的竞赛之路,现在竟然也渐渐看到了尾声。按理说,以我这种并算不上勤奋的性格,通常应该懒得写这种文章来纪念些什么。(实际上这篇文章已经成功地被我从4月份拖到了现在)。不过思来想去,尽管常常自诩能记住很久之前的事,但是......
  • 算法学习笔记(28): 筛法
    筛法线性筛杜教筛放在偏序关系\((\Z,|)\)中卷积……如何快速的求\(S(n)=\sum_{i=1}^nf(i)\)。如果能够找到一个函数\(g\):\[\begin{aligned}\sum_{i=1}^n(f*g)(i)&=\sum_{i=1}^n\sum_{d|i}f(\fracid)g(d)\\&=\sum_{d=1}^{n}g(d)\sum_{i......
  • 算法学习笔记(27): 后缀排序
    后缀排序本文做复习用,不宜初学用。开篇膜拜Pecco:算法学习笔记(84):后缀数组-知乎(zhihu.com)有些时候,其实\(O(n\log^2n)\)的排序也挺好。又短又简单。其中\(rk[i]\)表示从第\(i\)个字符开始的后缀的排名,\(sa[i]\)表示排名为\(i\)的后缀开始的位置。#includ......
  • java 定义个枚举常量
    Java中的枚举常量在Java中,枚举(Enumeration)是一种特殊的类,它限制了一个对象只能拥有一组预定义的值。枚举常量是定义在枚举类型中的固定值,它们可以被用作变量的取值范围,提供了更好的程序可读性和可维护性。本文将介绍Java中如何定义和使用枚举常量,并提供一些实际的代码示例供参考。......
  • java 将枚举转Json
    Java将枚举转为JSON引言在Java开发中,有时候需要将枚举类型转换为JSON格式。这样可以方便地在不同的系统或平台之间传递数据。本文将介绍如何使用Java代码实现将枚举类型转换为JSON格式的步骤和代码示例。流程概述下面是将枚举转为JSON的整个流程概述:步骤操作步骤1导......
  • 算法练习-day32
    动态规划62.不同路径题意:一个机器人位于一个mxn 网格的左上角(起始点在下图中标记为“Start”)。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?实例:思路:本题我们已知机器人只能走右和下两种方向,因此......
  • 面试题 10.05. 稀疏数组搜索
    稀疏数组搜索。有个排好序的字符串数组,其中散布着一些空字符串,编写一种方法,找出给定字符串的位置。示例1:输入:words=["at","","","","ball","","","car","","","dad","","&q......
  • 代码随想录算法训练营第一天| LeetCode 704. 二分查找、LeetCode 27. 移除元素
    704.二分查找    题目链接:https://leetcode.cn/problems/binary-search/   视频链接:https://www.bilibili.com/video/BV1fA4y1o715     文章讲解:https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html    卡哥的题目建......
  • Google tile 和 TMS 的索引算法
    Googletile和TMS的索引算法TMS是tilemapservice的缩写,是一种瓦片地图服务,也称之为WMTS(webmaptileservice),具体的标准可以见OGC网站。TMS的算法很简单,就是把投影后的世界地图按照层级进行四叉树(待验证)切割,切割后的瓦片数量随层级呈金字塔型,数量和层级关系如下表所示: 对......
  • SEO图片搜索
    什么是SEO图片搜索图片搜索是通过搜索程序,向用户提供互联网上相关的图片资料的服务。图片搜索的目的是查找出自己所需要的特定图片。网站的图片内容出现在整合搜索中,应该注意下面几点:一、ALT文字这是图片优化最重要的部分,因为ALT文字本身就是为了说明图片内容。ALT文字应该出现目标......