(蓝桥杯 刷题全集)【备战(蓝桥杯)算法竞赛-第1天】( 从头开始重新做题,记录备战竞赛路上的每一道题 )距离蓝桥杯还有75天

news2024/12/22 17:13:30

🏆🏆🏆🏆🏆🏆🏆
欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)
 
文章字体风格:
红色文字表示:重难点✔★
蓝色文字表示:思路以及想法✔★
 
如果大家觉得有帮助的话,感谢大家帮忙
点赞!收藏!转发!

 
我的qq号是:1210931886,欢迎大家加群,一起学习,互相交流,共同进步🎉🎉✨✨
🥇🥇🥇🥇🥇🥇🥇

蓝桥杯系列,为大家提供

  1. 做题全集,备战蓝桥杯,就做这个系列的题即可
  2. 一个大概的做题规划——大家最好在此基础上提前两个月准备

备战蓝桥杯就刷这些题
第一天博客链接
第二天博客链接

备战(蓝桥杯)算法竞赛-第1天

  • 一、快速排序
        • 1. 快速排序例题
        • 2. 第k个数( 快速选择 )
  • 二、归并排序
        • 1. 归并排序模板题
        • ★2. 逆序对的数量
  • 三、二分
        • 1. 数的范围
        • ★2. 数的三次方根
  • 四、高精度
        • 1. 高精度加法
        • 2. 高精度减法
        • 3. 高精度乘法
        • 4. 高精度除法 10:25-10:37(12分钟)
  • 五、前缀和
        • 2. 前缀和 (2分钟)
        • 3. 子矩阵的和(7分钟)

一、快速排序

1. 快速排序例题

原题链接

#include<iostream>
using namespace std;

void quick_sort(int a[],int r,int l)
{
    if(r >= l) return;
    
    int i = r - 1,j = l + 1,x = a[i + j >> 1];
    while(i < j)
    {
        do i++; while(a[i] < x);
        do j--; while(a[j] > x);
        if(i < j)swap(a[i],a[j]);
    }
    quick_sort(a,r,j),quick_sort(a,j+1,l);
}


int main()
{
    int n;
    cin >> n;
    int* a = (int*)malloc(sizeof(int)*n);
    for(int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    
    quick_sort(a,0,n-1);
    
    for(int i = 0; i < n; i++)
    {
        cout << a[i] << ' ';
    }
    return 0;
}

2. 第k个数( 快速选择 )

原题链接

#include<iostream>
using namespace std;

const int N = 1e6+10;

int a[N],k;

int quick_sort(int l,int r)
{
    if(l>=r)return a[r];
    int i = l-1,j = r+1,x = a[l+r>>1];
    while(i<j)
    {
        do i++;while(a[i]<x);
        do j--;while(a[j]>x);
        if(i<j)swap(a[i],a[j]);
    }
    if(j>=k)
        return quick_sort(l,j);
    else
        return quick_sort(j+1,r);
}

int main()
{
    int n;
    cin >> n >> k;
    for(int i = 1; i<= n; i++)
        cin >> a[i];
    
    cout << quick_sort(1,n);
}

二、归并排序

void merge_sort(int q[], int l, int r)
{
    if (l >= r) return;

    int mid = l + r >> 1;
    merge_sort(q, l, mid);
    merge_sort(q, mid + 1, r);

    int k = 0, i = l, j = mid + 1;
    while (i <= mid && j <= r)
        if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];
        else tmp[k ++ ] = q[j ++ ];

    while (i <= mid) tmp[k ++ ] = q[i ++ ];
    while (j <= r) tmp[k ++ ] = q[j ++ ];

    for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];
}

1. 归并排序模板题

原题链接

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 100010;
int array[N];
int nums;
unsigned long result = 0;

void merge_sort(int array[], int l, int r)
{
    if (l >= r) return;
    int mid = ( l + r  ) / 2;
    merge_sort(array, l, mid);
    merge_sort(array, mid + 1, r);
    int temp[r - l + 1];
    int lptr = l;
    int rptr = mid + 1;
    int tempptr = 0;
    while(lptr <= mid && rptr <= r)
    {
        if(array[lptr] <= array[rptr])
        {
            temp[tempptr++] = array[lptr++];
        } else {
            temp[tempptr++] = array[rptr++];
            result += (mid - lptr + 1);//注意这里,是直接加的,后面的不需要比较了。
        } 
    } 
    while ( lptr <= mid )
    {
        temp[tempptr++] = array[lptr++];
    }
    while ( rptr <= r )
    {
        temp[tempptr++] = array[rptr++];
    }
    for (int i = l, j = 0; i <= r; i ++, j ++)
    {
        array[i] = temp[j];
    }
}

int main(){
    scanf("%d", &nums);
    for(int i = 0; i < nums; i++)
    {
        scanf("%d", &array[i]);
    }
    merge_sort(array, 0, nums-1);
    cout << result;
    return 0;
}

★2. 逆序对的数量

原题链接

#include <iostream>

using namespace std;

typedef long long LL;

const int N = 1e5 + 10;

int a[N], tmp[N];

LL merge_sort(int q[], int l, int r)
{
    if (l >= r) return 0;

    int mid = l + r >> 1;

    LL res = merge_sort(q, l, mid) + merge_sort(q, mid + 1, r);

    int k = 0, i = l, j = mid + 1;
    while (i <= mid && j <= r)
        if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];
        else
        {
            res += mid - i + 1;
            tmp[k ++ ] = q[j ++ ];
        }
    while (i <= mid) tmp[k ++ ] = q[i ++ ];
    while (j <= r) tmp[k ++ ] = q[j ++ ];

    for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];

    return res;
}

int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]);

    cout << merge_sort(a, 0, n - 1) << endl;

    return 0;
}

三、二分

1. 数的范围

原题链接

#include<iostream>
using namespace std;

int n = 100010;
int a[100010] = {0};
int q,k,m;
        int l,r,mid;
int main()
{
    
    cin >> q >> m;
    for(int i = 0; i < q; i++)
    {
        cin >> a[i];
    }
    
    while(m--)
    {
        int s;
        cin >> s;
        l = 0,r = q - 1,mid;
        while(l<r)
        {
            mid = (l + r) / 2;
            if(a[mid] >= s) r = mid;
            else l = mid + 1;
        }
        if(a[l] != s)cout << "-1 -1" << endl;
        else
        {
            cout << l << " ";
            l = 0,r = q - 1,mid;
            while(l<r)
            {
                 mid = (l + r + 1) / 2;
                 if(a[mid] <= s) l = mid;
                  else r = mid - 1;
            }
            cout << l << ' ' << endl;
        }
    }
    
    return 0;
}

★2. 数的三次方根

原题链接

#include<iostream>
using namespace std;

int main()
{
    double x;
    cin >> x;
    
    double l = -100,r = 100;
    while(r - l > 1e-8)
    {
        double mid = (l + r) / 2;
        if(mid * mid * mid >= x) r = mid;
        else l = mid;
    }
    
    printf("%.6f",l);
    return 0;
}

四、高精度

1. 高精度加法

原题链接

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

vector<int> add(vector<int> &A,vector<int> &B)
{
    if(A.size() < B.size())
        return add(B,A);
    
    vector<int> C;
    int t = 0;
    for(int i = 0; i < A.size(); i++)
    {
        t+=A[i];
        if(i<B.size()) t+=B[i];
        C.push_back(t % 10);
        t /= 10;    
    }
    if(t)
    C.push_back(t);
    return C;
}

int main()
{
    string a,b;
    cin >> a >>b;
    vector<int> A,B;
    for(int i = a.size() - 1; i >=0; i--)A.push_back(a[i] - '0');
    for(int i = b.size() - 1; i >=0; i--)B.push_back(b[i] - '0');
    
    auto C = add(A,B);
    
    for(int i = C.size() - 1; i >=0; i--)
    cout << C[i];
    
    
    return 0;
}

2. 高精度减法

原题链接
在这里插入图片描述
二刷:

  1. 小减大 需要转换成 大-小
  2. 如果出现负数 (x+10)%10 t = 1不是-1
  3. t = a[i] - t; t = t - b[i]
#include <iostream>
#include <vector>

using namespace std;

bool cmp(vector<int> &A, vector<int> &B)
{
    if (A.size() != B.size()) return A.size() > B.size();

    for (int i = A.size() - 1; i >= 0; i -- )
        if (A[i] != B[i])
            return A[i] > B[i];

    return true;
}

vector<int> sub(vector<int> &A, vector<int> &B)
{
    vector<int> C;
    for (int i = 0, t = 0; i < A.size(); i ++ )
    {
        t = A[i] - t;
        if (i < B.size()) t -= B[i];
        C.push_back((t + 10) % 10);
        if (t < 0) t = 1;
        else t = 0;
    }

    while (C.size() > 1 && C.back() == 0) C.pop_back();
    return C;
}

int main()
{
    string a, b;
    vector<int> A, B;
    cin >> a >> b;
    for (int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0');
    for (int i = b.size() - 1; i >= 0; i -- ) B.push_back(b[i] - '0');

    vector<int> C;

    if (cmp(A, B)) C = sub(A, B);
    else C = sub(B, A), cout << '-';

    for (int i = C.size() - 1; i >= 0; i -- ) cout << C[i];
    cout << endl;

    return 0;
}

3. 高精度乘法

原题链接

#include <iostream>
#include <vector>

using namespace std;


vector<int> mul(vector<int> &A, int b)
{
    vector<int> C;

    int t = 0;
    for (int i = 0; i < A.size() || t; i ++ )
    {
        if (i < A.size()) t += A[i] * b;
        C.push_back(t % 10);
        t /= 10;
    }

    while (C.size() > 1 && C.back() == 0) C.pop_back();

    return C;
}


int main()
{
    string a;
    int b;

    cin >> a >> b;

    vector<int> A;
    for (int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0');

    auto C = mul(A, b);

    for (int i = C.size() - 1; i >= 0; i -- ) printf("%d", C[i]);

    return 0;
}

4. 高精度除法 10:25-10:37(12分钟)

原题链接

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

void div(vector<int> a,int b)
{
    vector<int> ans;
    
    int t = 0;
    for(int i = a.size()-1; i >= 0; i--)
    {
        t = t * 10 + a[i];
        ans.push_back(t/b);
        t = t-t/b*b;
    }
    
    reverse(ans.begin(),ans.end());
    
    while(ans.size()>1 && ans.back()==0)ans.pop_back();
    
    for(int i = ans.size()-1; i >=0; i--)
        cout << ans[i];
    cout << endl;
    cout << t;
    
}

int main()
{
    string s1;
    int b;
    vector<int>a;
    
    cin >> s1 >> b;
    
    for(int i = s1.size()-1; i >= 0; i--) a.push_back(s1[i]-'0');
    
    div(a,b);
    
    return 0;
}

五、前缀和

2. 前缀和 (2分钟)

原题链接

#include<iostream>

using namespace std;

const int N = 1e5+10;

int a[N],s[N];

int main()
{
    int n,m;
    
    cin >> n >> m;
    
    for(int i = 1; i <= n; i++)
    {
        cin >> a[i];
        s[i] = a[i] + s[i-1];
    }
    
    while(m--)
    {
        int l,r;
        cin >> l >> r;
        
        cout << s[r] - s[l-1] << endl;
        
    }
    
    return 0;
}

3. 子矩阵的和(7分钟)

原题链接

#include<iostream>

using namespace std;

const int N = 1010;

int a[N][N],s[N][N];

int main()
{
    int n,m,q;
    cin >> n >> m >> q;
    
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
        {
            cin >> a[i][j];
            s[i][j] = a[i][j] + s[i-1][j] + s[i][j-1] - s[i-1][j-1];
        }

    while(q--)
    {
        int x1,y1,x2,y2;
        cin >> x1 >> y1 >> x2 >> y2;
        
        cout << s[x2][y2] - s[x1-1][y2] - s[x2][y1-1] + s[x1-1][y1-1] << endl; 
        
    }
    
    
    
    return 0;
}

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

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

相关文章

2023年“华数杯”国际数模赛赛题浅析

2023华数杯如期开赛&#xff0c;本次比赛作为美赛的模拟赛&#xff0c;赛题和比赛时间都和美赛高度相似&#xff0c;因此大家 完全可以当作一次美赛之前的练习赛进行。美赛的发题时间与华数杯一致&#xff0c;都是早晨六点&#xff0c;现已经将机器翻译的初步翻译 结果进行了分…

Gdb调试复现Dirty Pipe漏洞(CVE-2022-0847)之内核态调试

第一、准备环节-增加内核调试辅助语句&#xff1a; 首先&#xff0c;为了更好的查看关键因素的变化&#xff1a;稍微做了两处修改&#xff1a; 第一处:splice前后&#xff0c;增加getchar和puts; 第二处:prepare pipe过程中&#xff0c;增加getchar和puts; 修改后代码执行结…

Spring Bean生命周期,就像人的一生

这篇我们来看一看Spring中Bean的生命周期&#xff0c;我发现&#xff0c;和人的一生真的很像。1 简单说说IoC和BeanIoC&#xff0c;控制反转&#xff0c;想必大家都知道&#xff0c;所谓的控制反转&#xff0c;就是把new对象的权利交给容器&#xff0c;所有的对象都被容器控制&…

利用STC15输出两路互补SPWM波形

利用STC15输出两路互补SPWM波形&#x1f39e;逻辑分析仪信号采集演示&#xff1a; &#x1f516;本案例使用的是IAP15W4K61S4验证。 &#x1f4cd;相关篇《STC15系列PWM相关功能寄存器介绍》 &#x1f4cc;相关开源PCB《【PCB开源分享】STC/IAP15W4K61S4开发板》 &#…

Linux(七)进程间通信

进程间是如何进行通信的&#xff1f; 通过前面的学习之后&#xff0c;我们知道进程间是具有独立性的&#xff0c;在操作系统的层面来看&#xff0c;进程就是一块pcb&#xff0c;是对运行中的程序动态运行过程的描述&#xff0c;在Linux角度下&#xff0c;进程就是一个task_stru…

2-2JVM-GC垃圾回收

GC垃圾回收 了解什么是垃圾回收掌握垃圾会回收的常见算法学习串行、并行、并发、G1垃圾收集器学习GC日志的可视化查看 1.什么是垃圾回收&#xff1f; 程序的运行必然需要申请内存资源&#xff0c;无效的对象资源如果不及时处理就会一直占有内存资源&#xff0c;最终将导致内…

YOLOv5/v7 Falsk Web 监测平台 | YOLOv5/v7 Falsk Web 部署

YOLOv7 Falsk Web 监测平台图片效果展示 YOLOv7 Falsk Web 监测平台视频效果展示 YOLOv7 Flask Web 检测平台 什么是Flask? 简介 Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开…

HTB_Jerry tomcat弱口令war包getshell

文章目录信息收集Tomcat war 包 getshell信息收集 扫描发现 8080 端口存在 tomcat 服务&#xff0c;访问 manage app 管理接口&#xff0c;需要输入账号密码 点击取消&#xff0c;看到默认账号密码&#xff0c;重新登录&#xff0c;登录成功&#xff0c;未修改 一般就是上传或…

JVM类加载

作用&#xff1a;负责从硬盘/网络中加载字节码信息&#xff0c;加载到内存中&#xff08;运行时数据区的方法区中&#xff09; 类加载过程&#xff1a; 加载 使用IO读取字节码文件&#xff0c;转换并存储 为每个类创建一个Class类的对象 存储在方法区中 链接&#xff08;…

Jackson注解使用分析

文章目录Jackson常用注解1. 常用注解汇总2. 注解使用分析JsonIncludeJsonAnyGetterJsonAnySetterJsonNamingJsonAutoDetectJacksonInjectJsonAliasJsonValueJsonMergeJsonRawValueJsonEnumDefaultValueJsonFilterJsonSerializeJsonDeserializeJacksonAnnotationJacksonAnnotati…

excel合并技巧:查找函数遇到合并单元格怎么应对

大家都在期盼奖金的到来&#xff0c;可是核算奖金的同事正在苦恼&#xff0c;因为以前用得好好的VLOOKUP函数突然不合适了&#xff0c;很多人的奖金计算出来都变成了乱码&#xff1a;使用VLOOKUP函数每个部门只有第一行正确&#xff0c;其他都是乱码。看到这个表&#xff0c;相…

【服务器数据恢复】raid5硬盘离线后热备盘未启用的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌X3850服务器&#xff0c;组建的raid5磁盘阵列&#xff0c;该raid5磁盘阵列包含4块成员盘和1块热备盘。 服务器故障&#xff1a; 服务器在运行过程中由于未知原因突然崩溃&#xff0c;用户方工程师检查后发现该故障服务器raid5阵列中2块磁…

Electron + Vue 开发环境搭建

1.安装nodejs&#xff0c;下载网址&#xff1a;https://nodejs.org/en/ 点击安装程序&#xff0c;一路next即可 安装完成之后打开cmd测试&#xff0c;输入node -v查看node版本&#xff0c;输入npm -v查看npm版本 安装完成后&#xff0c;.msi格式的安装包已经将node.exe添加到…

Excel连接openGauss数据库实操

目录 前言 一、通过excel 添加数据源访问openGauss 1、查看Excel版本 2、下载 ODBC驱动 3、安装ODBC驱动 4、添加ODBC数据源 5、在excel中添加数据源&#xff08;访问openGauss&#xff09; 二、通过excel 的VBA&#xff08;宏&#xff09;访问openGauss 1、宏权限设置…

2.1 java基础 day02 流程控制 创建类和对象 栈堆元空间

1流程控制 流程控制&#xff1a; 1.1.计算机在执行代码时对指令代码执行顺序的控制 1.2.Java 流程控制主要分三种&#xff1a; 顺序执行 分支执行 重复执行 1.3.顺序执行 按代码和语法出现的先后顺序执行 1.4.分支执行 根据判断条件执行分支逻辑 可选分支、必选分支&#…

活体识别6:小视科技开源的静默活体检测

说明 该项目为小视科技的静默活体检测项目。开源地址在 https://github.com/minivision-ai/Silent-Face-Anti-Spoofing。 由于不是论文衍生项目&#xff0c;所以只有一个公众号文章的介绍&#xff1a;https://mp.weixin.qq.com/s/IoWxF5cbi32Gya1O25DhRQ 方案详情 该方案是…

【安全】端口复用:远程遥控iptablesSSLH工具

目录 基础知识点 链的概念 表的概念 表链关系 远程遥控iptables进行端口复用 Ⅰ、利用ICMP做遥控开关 ①创建端口复用链 ②创建端口复用规则&#xff0c;将流量转发至 22 端口 ③开启开关&#xff0c;如果接收到一个长为 1139 的 ICMP 包&#xff0c;则将来源 IP 添加到…

使用Oracle VM VirtualBox安装Centos

1.下载安装Oracle VM VirtualBox 2.下载Centos 下载地址 旧版本 3.新建 选择镜像填写账户信息之后&#xff0c;我这边不知道什么原因&#xff0c;并不能完成所有工作&#xff0c;所以我一般不选择 4.选择镜像 5.安装 通过方向键和回车键选择 6.设置 选择中文 等待一些自动…

2023年“华数杯”国际大学生数学建模B题完整思路

2023华数杯如期开赛&#xff0c;本次比赛作为美赛的模拟赛&#xff0c;赛题和比赛时间都和美赛高度相似&#xff0c;因此大家 完全可以当作一次美赛之前的练习赛进行。美赛的发题时间与华数杯一致&#xff0c;都是早晨六点&#xff0c;现已经将机器翻译的初步翻译 结果进行了分…

c语言通讯录max——数据的持久化处理(详解)

用文件操作升级通讯录前言1.实现逻辑2.用哪种文件存储数据2. save_contact函数设计3. load_contact 函数设计5.代码总览contact.hcontact.ctext.c前言 在有关通讯录的上一篇博客中&#xff0c;作者用柔性数组实现了动态改变通讯录占用空间的功能&#xff0c;但是在最后还是留下…