首页 > 编程语言 >算法笔记

算法笔记

时间:2023-04-03 17:02:30浏览次数:32  
标签:return int step 笔记 while ++ 算法 ans

笔记仅为个人总结模板和理解。。。

快速幂:

    while (n) //n为多少次方{
        if (n & 1)
            k = k * x % mod;
        n >>= 1;
        x = x * x % mod;
    }
    return k ;
}

 

差分:

    for(int i=1;i<=n;i++)
    {
        int t,c;
        cin>>t>>c;
        int l=max(0,t-k-c+1);
        int r=max(0,t-k);
        s[l]++;
        s[r+1]--;
    }
    for(int i=1;i<=200010;i++)s[i]+=s[i-1];

“差分是前缀和的逆运算”,只是感觉是有点像,可能还得再理解理解

筛质数:

bool finds(int n)
{
    if(n<=1)return false;
    for(int i=2;i<=n/i;i++)
    {
        if(n%i==0)
        return false;
    }
    return true;
}

发现这种筛质数方法好像更节约时间

dfs(深度优先搜索)/bfs(广度优先搜索):

    for(int i=0;i<4;i++)
    {
        int tx=x+dx[i];
        int ty=y+dy[i];
        if(tx>0&&ty>0&&tx<=n&&ty<=m&&!maps[tx][ty])
        {
            maps[tx][ty]=1;
            dfs(tx,ty);
            maps[tx][ty]=0;//应对路径进行回溯
        }
    }

搜索中,部分题需要回溯;以及部分题不需要重开标记数组,直接在原数组上修改即可

邻接表:

  vector<ll>v[100010];//多维数组,邻接表的初始化
    for(int i=1;i<n;i++)
    {
        int a,b;
        cin>>a>>b;
        v[a].push_back(b);
        v[b].push_back(a);
    }
 int dfs(int step,int t)//邻接表的遍历
{
    if(a[step])t++;
    else t=0;
    if(t>m||vis[step])return 0;
    vis[step]=1;
    int ans=0;
     if (step > 1 && v[step].size() == 1) return 1;
    for(int i=0;i<v[step].size();i++)
    {
        ans+=dfs(v[step][i],t);
    }
    return ans;
}

进制转换:

string s;//十转高进制
char a[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 65, 66, 67, 68, 69, 70};
int main() {
    ll n;
    cin >> n;
    while (n) {
        s = s + a[n % 16];
        n /= 16;
    }
cout<<s;

并查集:

   while(n--)p[n]=n;//初始化
。。。。。。。。。//缺少并的过程
  int find(int x)//查找
{
    if(p[x]!=x)p[x]=find(p[x]);//其中x为子节点,f[x]为父亲节点;
    return p[x];
}

记录不同斜率直线数量(避免爆精度)

                  map<pair<int,int>,int>maps;//初始化,建立map容器存储分子分母
        pair<int,int>ans;//以下为核心代码
        ans.first=k1/gcd(k1,k2);//利用欧几里得算法求最简形式
        ans.second=k2/gcd(k1,k2);
        if(maps[ans]==0)
        {
            maps[ans]=5;
            res++;
        }

哈希:

unordered_map<char,int>mp;//初始化
    char ch;//和谐算法
    ll ans=0;
    while(cin>>ch)
    {
        mp[ch]++;
    }
    for(int i='0';i<='9';i++)
    {
        ans+=(ll)mp[i]*mp[i];
    }
    cout<<ans;

dp(动态规划)

#include <bits/stdc++.h>//完全背包问题
using namespace std;
typedef long long ll;
int v[1010], w[1010] ;
int dp[1010][1010];
int main() {
    int n, vv;
    cin >> n >> vv;
    for (int i = 0; i < n; i++)
        cin >> v[i] >> w[i];
    for (int i = 0; i <n; i++) {
        for (int j = 1; j <= vv; j++) {
            if (j <v[i]) {
                dp[i+1][j] = dp[i][j];
            } else {
                dp[i+1][j] = max(dp[i][j], dp[i+1][j - v[i]] + w[i]);//判断向左和上一级
            }
        }
    }
    cout << dp[n][vv];
}
注:
01背包问题中的判断从上一级添加物品,即i-1;
dp[i][j] = max(dp[i-1][j], dp[i-1][j - v[i]] + w[i]);
完全背包可以从同一级添加物品即:i
dp[i][j] = max(dp[i-1][j], dp[i][j - v[i]] + w[i]);

dp真难,不算总结,多看看学会

杂类算法及注释:

1.vector中pair的排序

vector<pair<int ,int> >v;
sort(v.begin(),v.end());//排序以v.first为准

2.全排列函数的运用(全排列yyds)

#include <iostream>
#include<algorithm>
using namespace std;
 
int main(int argc, char** argv) {
    int a[4]={1,2,3,4};
    sort(a,a+4);
    do{
        //cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3]<<endl;
        for(int i=0;i<4;i++)
            cout<<a[i]<<" ";
        cout<<endl;
    }while(next_permutation(a,a+4));
    return 0;
}

3.gcd(欧几里得算法)//求最大公约数

 int gcd(int a,int b)
 {
     while(b)
     {
         int t=a%b;
         a=b;
         b=t;
     }
     return a;
 }

补充

1.最小公倍数求法为:两数相乘除以最大公约数

2.分数最简形式:分子/最大公约数

分母/最大公约数  

4.注意!

t*=k%mod不等于t=t*k%mod;

=========================================================

更新中,笔记搬运未完全。。。大概率不会更新太久(懒),权当复习

标签:return,int,step,笔记,while,++,算法,ans
From: https://www.cnblogs.com/eeeece/p/17283603.html

相关文章

  • 二分查找(算法笔记)
    核心代码(循环):intf=-1;while(left<=right){intmid=(left+right)/2;if(a[mid]==key){f=mid;break;}if(key<a[mid])right=mid-1;if(key>a[mid])left=mid+1;}if(f==-1)cout<<“没找到”elsecout<<f<<endl......
  • 从传感器和算法原理讲起,机器人是如何避障的
    避障是指移动机器人在行走过程中,通过传感器感知到在其规划路线上存在静态或动态障碍物时,按照一定的算法实时更新路径,绕过障碍物,最后达到目标点。避障常用哪些传感器不管是要进行导航规划还是避障,感知周边环境信息是第一步。就避障来说,移动机器人需要通过传感器实时获取自身周围......
  • TypeScript 学习笔记 — 基于对象操作的内置类型的使用(十二)
    目录1.Partial转化可选属性(?)2.Required转化必填属性(-?)3.Readonly转化仅读属性(readonly)Mutate(非内置,与Readonly相对)(-readonly)4.Pick挑选所需的属性5.Omit忽略属性在前几章的笔记中,了解了以下几种内置类型:条件类型相关:Exclude排除类型(差集),Extract抽取......
  • ORB_SLAM3源码阅读笔记(三)
    LocalMapping线程    与Tracking线程一样,同样从LocalMapping线程的创建开始逐步对LocalMapping进行分析。1LocalMapping线程的创建mpLocalMapper=newLocalMapping(this,mpAtlas,mSensor==MONOCULAR||mSensor==IMU_MONOCULAR,mSensor==IMU_MONOCULAR||mSensor==......
  • 重要!每个开发者都应该掌握的9个核心算法
    许多开发者似乎都有一个很大的误解,认为算法在编程工作中没什么用处,只是工作面试中的加分项。其实并不是这样的,成为一名有秀的开发者,极其重要的是具备算法思维能力。不仅能够复制和修改标准算法,还能够使用代码运用算法解决遇到的任何问题。这里介绍9种核心算法,这是你成为高阶开发......
  • m基于AlexNet神经网络和GEI步态能量图的步态识别算法MATLAB仿真
    1.算法描述        AlexNet是2012年ImageNet竞赛冠军获得者Hinton和他的学生AlexKrizhevsky设计的。也是在那年之后,更多的更深的神经网络被提出,比如优秀的vgg,GoogLeNet。这对于传统的机器学习分类算法而言,已经相当的出色。Alexnet网络模型于2012年提出。它具有更高维......
  • Mysql学习笔记
    1.查看所有数据库showdatabases2.创建数据库createdatabase数据库名3.选择数据库use数据库名4.查看当前数据库下的所有表showtables5.查看表的创建结构,包括创建语句,表的字符集等showcreatetable表名......
  • 分布式计算ECHO算法(IT部落格)
    packageorg.ustc.scst.dc.simulation.algorithms.echo;importjava.awt.Color;importorg.ustc.scst.dc.simulation.algorithms.echo.IntMessage;importorg.ustc.scst.dc.simulation.model.Message;importorg.ustc.scst.dc.simulation.model.Node;/***Thiss......
  • 最快速度求两个数组之交集算法
    该题目来自58同城的二面,用最快速度求两个数组之交集算法。比如A={6,2,4,1},B={2,9,4,3},那么A&B={2,4}。算法一:在大多数情况,也就是一般的情况下,大家都能想出最暴力的解法,通常也就是采用遍历或者枚举的办法来解决问题。该题需要找出两个数组的交集,最简单的一个办法就是用A数......
  • 微信小程序学习笔记——第一个微信小程序
    打开微信开发者工具 扫码登录之后,创建项目项目创建好之后 ......