《算法竞赛进阶指南》(持续更新ing)

news2024/11/27 5:40:11

算法竞赛进阶指南

位运算

AcWing 89. a^b

#include<iostream>
using namespace std;

int main(void)
{
    long long a,b,p;
    cin>>a>>b>>p;
    long long ans=1%p;
    while(b)
    {
        if(b&1)//判断b当前二进制位是否为1
        {
            ans=ans*a%p;
        }
        a=a*a%p;//每跨越一个二进制位,b就是多加一次2的(k-1)次方,假设当前跨越到第二个二进制位,那么b就会加上一个2^(2-1)次方
        b>>=1;//b右移一位
    }
    cout<<ans;
    return 0;
}

AcWing 90. 64位整数乘法

#include<iostream>
using namespace std;

int main(void)
{
    long long a,b,p,ans=0;
    cin>>a>>b>>p;
    while(b)
    {
        if(b&1)
        {
            ans=(ans+a)%p;
        }
        a=a*2%p;
        b>>=1;
    }
    cout<<ans;
    return 0;
}

AcWing 998. 起床困难综合症

#include<iostream>
using namespace std;
int n,m;
typedef pair<string,int>PII;
PII a[100010];

int calc(int bit,int now)
{
    for(int i=1;i<=n;i++)
    {
        int x=a[i].second>>bit&1;//拿到当前x的第bit位是0/1
        if(a[i].first=="AND") now&=x;
        else if(a[i].first=="OR") now|=x;
        else if(a[i].first=="XOR") now^=x;
    }
    return now;
}

int main(void)
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        char op[5];
        int x;
        scanf("%s %d",op,&x);
        a[i]={op,x};
    }
    int val=0,ans=0,maxi=-10010;
    //枚举bit位
    for(int bit=29;bit>=0;bit--)
    {
        int res0=calc(bit,0);//当第bit位为0的时候
        int res1=calc(bit,1);//当第bit位为1的时候
        if(val+(1<<bit)<=m&&res0<res1)//当前bit位确定为1,并且初始攻击val加上新bit位之后还是<m
        {
            val+=1<<bit,ans+=(res1<<bit);//更新初始的攻击值,更新答案
        }else
        {
            ans+=(res0<<bit);//第bit位为0,所以不需要对val+值
        }
        //cout<<"res0 = "<<res0<<" res1 = "<<res1<<endl;
        maxi=max(maxi,ans);
    }
    cout<<maxi;
    return 0;
}

递推与递归

AcWing 92. 递归实现指数型枚举

#include<iostream>
#include<vector>
using namespace std;
int n;

vector<int>chosen;

void calc(int x)
{
    //边界
    if (x == n + 1)
    {
        for (int i = 0; i < chosen.size(); i++)
        {
           printf("%d ", chosen[i]);
        }
        puts("");
        return;
    }
	//不选当前数
    calc(x+1);//递归分支
    //选择当前数
    chosen.push_back(x);

    calc(x+1);//递归分支
    chosen.pop_back();//回溯
}

int main(void)
{
    cin >> n;
    calc(1);
    return 0;
}

AcWing 93. 递归实现组合型枚举

#include<iostream>
#include<vector>
using namespace std;
int n,m;

vector<int>chosen;

void calc(int x)
{
    if(chosen.size()>m||chosen.size()+(n-x+1)<m) return ;//如果当前选择数字超过了m个,或者当前选的数字加上剩余的数字都不足m个就可以return剪枝了
    //边界
    if (x==n+1)
    {
        for (int i = 0; i < chosen.size(); i++)
        {
           printf("%d ", chosen[i]);
        }
        puts("");
        return;
    }

    chosen.push_back(x);
    calc(x+1);
    chosen.pop_back();
    calc(x+1);
}

int main(void)
{
    cin >> n>>m;
    calc(1);
    return 0;
}

AcWing 94. 递归实现排列型枚举

#include<iostream>
using namespace std;
int n;
bool st[20];
int ans[20];

void dfs(int x)
{
    if(x==n+1)
    {
        for(int i=1;i<=n;i++)
        {
            printf("%d ",ans[i]);
        }
        puts("");
    }
    for(int i=1;i<=n;i++)
    {
        if(st[i]) continue;
        st[i]=true;//i被选了
        ans[x]=i;//第x个位置选了i
        dfs(x+1);//递归分支
        st[i]=false;//回溯
    }
}

int main(void)
{
    cin>>n;
    dfs(1);
    return 0;
}

AcWing 95. 费解的开关

#include<iostream>
#include<cstring>
using namespace std;
const int N=6;
char g[N][N],backup[N][N];
int dx[N] = { -1, 0, 1, 0, 0 }, dy[N] = { 0, 1, 0, -1, 0 };

void turn(int x,int y)
{
    for(int i=0;i<5;i++)
    {
        int ax=x+dx[i],ay=y+dy[i];
        if(ax<0||ax>=5||ay<0||ay>=5) continue;
        if(g[ax][ay]=='0')g[ax][ay]='1';
        else g[ax][ay]='0';
    }
}


int main(void)
{
    int n=0;
    cin>>n;
    while(n--)
    {
        for(int i=0;i<5;i++) cin>>g[i];
        int res=10010;
        for(int op=0;op<32;op++)//因为每一组有5行,所以方案数为2^5=32种方案,可以利用二进制序列来遍历这32种方案,从00000->11111
        //0表示不按,1表示按
        {
            int step=0;//步数
            memcpy(backup,g,sizeof g);//因为要对原来的地图进行修改且不止一种方案,如果不对地图进行备份,原地图就会丢失。
            for(int i=0;i<5;i++)//通过对二进制进行右移i位,得到右移后的最后一个位置的二进制序列是否为1
            {
                if(op>>i&1)//如果是1,就表示要按下去
                {
                    step++;
                    turn(0,i);
                }
            }
            //第一行遍历了之后下面的方案已经定下来了,直接莽
            for(int i=0;i<4;i++)
            {
                for(int j=0;j<5;j++)
                {
                    if(g[i][j]=='0')
                    {
                        step++;
                        turn(i+1,j);
                    }
                }
            }
            //检查答案
            bool dark=false;
            for(int j=0;j<5;j++)
            {
                if(g[4][j]=='0')
                {
                    dark=true;
                    break;//已经不满足条件了,退出检查
                }
            }
            //得还原地图咯
            memcpy(g,backup,sizeof g);
            if(!dark) res=min(res,step);//更新最短距离
        }
            if(res>6) res=-1;
            cout<<res<<endl;
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/551387.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用WaveNet预测(Adapted Google WaveNet-Time Series Forecasting)

目录 剧情简介: 数据来源 加载数据 分割数据和可视化 时间序列的多元波网模型:实现(多步预测) 创建模型 创建数据集 数据准备 1- Training dataset preparation 2- Validation dataset preparation Train the Model with TPU: 使用经过训练的适应Google WaveNet预测…

【多线程】| 基本知识汇总

目录 &#x1f981; 掌握基本概念1. 什么是线程&#xff1f;2. 什么是主线程以及子线程&#xff1f;3. 什么是串行&#xff1f;什么是并行&#xff1f; 什么是并发? &#x1f981; 线程的创建1. 通过继承Thread类实现多线程2. 通过Runnable接口实现多线程 &#x1f981; 线程执…

AI故事:智慧学校的人脸识别奇幻之旅

人脸识别 在一个名为智慧学校的小镇上&#xff0c;生物老师Rita和她的丈夫朝哥&#xff0c;一个富有创造力的艺术家&#xff0c;过着幸福美满的生活。他们的家庭与学校紧密相连&#xff0c;成为了一座小小的教育乐园。 智慧学校里有一群充满朝气的学生&#xff0c;其中小枣是…

自定义属性,v-bind computed的使用

0.0 自定义组件的使用 【掌握】 先自定义自己的组件 引入组件 import 组件名 from 路径/文件名 注册组件 <script> export default {components:{ // 组件注册组件名:组件名&#xff0c;组件名1},data(){ // 数据return {}},methods:{ // 方法} ​ } ​ </script&…

buu [AFCTF2018]MyOwnCBC 1

题目描述&#xff1a; 三份文件 #!/usr/bin/python2.7 # -*- coding: utf-8 -*-from Crypto.Cipher import AES from Crypto.Random import random from Crypto.Util.number import long_to_bytesdef MyOwnCBC(key, plain):if len(key)!32:return "error!"cipher_t…

lwIP更新记03:IPv6

从 lwIP-2.0.0 开始&#xff0c;lwIP 终于有可用的 IPv6 协议栈了&#xff01;IPv6 支持 双栈&#xff08;IPv4 和 IPv6 同时使用&#xff09; 或 IPv4/IPv6 二选一 模式。 lwIP-1.4.1 版本也有 IPv6&#xff0c;但那是实验性质的&#xff08;见…\lwip-1.4.1\src\core\ipv6目…

linux专题:嵌入式linux系统启动流程基础分析

目录 第一&#xff1a;linux内核源码基本简介 第二&#xff1a;uboot启动分析 第三&#xff1a;内核源码分析 第一&#xff1a;linux内核源码基本简介 下载 Linux 内核网址&#xff1a; https://www.kernel.org/ 最新 Linux 内核是 5.15 版本。现在常用 Linux 内核源码为4…

八大排序-直接插入排序、希尔排序、直接选择排序、冒泡排序、堆排序、快速排序、归并排序、基数排序

目录 前言 直接插入排序&#xff08;Insertion Sort&#xff09; 一、概念及其介绍 二、过程图示 三、代码 四、复杂度 希尔排序&#xff08;Shell Sort&#xff09; 一、概念 二、实现思路 三、图示过程 四、代码 4.1代码 4.2运行结果 4.3解释 五、复杂度 堆排…

路径规划算法:基于蝙蝠算法的路径规划算法- 附代码

路径规划算法&#xff1a;基于蝙蝠的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于蝙蝠的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法蝙蝠算法来进…

Swift 如何闪电般异步读取大文件?

功能需求 Apple 系统中&#xff08;iOS、MacOS、WatchOS等等&#xff09;读取文件是一个平常的不能再平常的需求&#xff0c;不过当文件很大时&#xff0c;同步读取文件会导致 UI 的挂起&#xff0c;这是不能让用户接受的。 所以&#xff0c;要想读取文件内容的同时保持界面操…

KMP算法及其改进图文详解

文章目录 KMP算法详解什么是KMP算法KMP算法的应用场景KMP算法和暴力求解的比较字符串的前缀、后缀和最长相等前后缀KMP算法实现字符串匹配的具体过程&#xff08;图解&#xff09;从串与主串的下标变化j回退的位置(从串的下标变化)主串的下标变化 Next数组如何运用代码逻辑计算…

[CTF/网络安全] 攻防世界 xff_referer 解题详析

[CTF/网络安全] 攻防世界 xff_referer 解题详析 XFF及refererXFF格式referer格式姿势总结 题目描述&#xff1a;X老师告诉小宁其实xff和referer是可以伪造的。 XFF及referer X-Forwarded-For&#xff08;简称 XFF&#xff09;是一个 HTTP 请求头部字段&#xff0c;它用于表示 …

深入理解计算机系统第七章知识点总结

文章目录 详解ELF文件-> main.o前十六个字节的含义推测elf的大小查看节头部表推断每个section在elf中的具体位置查看.text的内容查看.data的内容关于.bss查看.rodata的内容关于其他的节表示的信息 详解符号表符号编译器如何解析多重定义的全局符号静态库与静态链接构造和使用…

seata的部署和集成

seata的部署和集成 一、部署Seata的tc-server 1.下载 首先我们要下载seata-server包&#xff0c;地址在http://seata.io/zh-cn/blog/download.html 2.解压 在非中文目录解压缩这个zip包&#xff0c;其目录结构如下&#xff1a; 3.修改配置 修改conf目录下的registry.conf文…

开源大模型资料总结

基本只关注开源大模型资料&#xff0c;非开源就不关注了&#xff0c;意义也不大。 基座大模型&#xff1a; LLaMA&#xff1a;7/13/33/65B&#xff0c;1.4T token LLaMA及其子孙模型概述 - 知乎 GLM&#xff1a;6/130B&#xff0c; ChatGLM基座&#xff1a;GLM&#xff08…

【网络】- TCP/IP四层(五层)协议 - 网际层(网络层) - 网际协议IP

目录 一、概述 二、初步了解网际协议 IP  &#x1f449;2.1 与数据链路层的区别  &#x1f449;2.2 网际协议 IP 概览  &#x1f449;2.3 分层的意义 三、IP协议基础知识  &#x1f449;3.1 IP地址属于网络层地址  &#x1f449;3.2 路由控制  &#x1f449;3.3 IP分包与…

solr快速上手:核心概念及solr-admin界面介绍(二)

0. 引言 上一节&#xff0c;我们简单介绍了solr并演示了单节点solr的安装流程&#xff0c;本章&#xff0c;我们继续讲解solr的核心概念 solr快速上手&#xff1a;solr简介及安装&#xff08;一&#xff09; 1. 核心概念 核心&#xff08;索引/表&#xff09; 在es中有索引…

【软件测试】5年测试老鸟总结,自动化测试成功实施,你应该知道的...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 自动化测试 Pytho…

基于html+css的图展示82

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

chatgpt赋能Python-pythonage

Pythonage - 一款优秀的Python SEO工具 无论是个人博客还是商业网站&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;都是最重要的。Pythonage是一款优秀的Python SEO工具&#xff0c;可以帮助你优化你的网站并提高搜索引擎排名。在这篇文章中&#xff0c;我们将详细介绍…