lqb_算法

news2024/12/12 20:21:14

1.蓝桥杯2024年第十五届决赛真题- 蚂蚁开会

题目描述

二维平面上有 n 只蚂蚁,每只蚂蚁有一条线段作为活动范围,第 i 只蚂蚁的活动范围的两个端点为 (uix, uiy),(vix, viy)。现在蚂蚁们考虑在这些线段的交点处设置会议中心。为了尽可能节省经费,它们决定只在所有交点为整点的地方设置会议中心,请问需要设置多少个会议中心?

输入格式

输入共 n + 1 行。第一行为一个正整数 n。后面 n 行,每行 4 个由空格分开的整数表示 uix, uiy, vix, viy。

输出格式

输出共 1 行,一个整数表示答案。

样例输入

复制

4
0 0 4 4
0 4 4 0
2 0 0 4
2 1 2 3

样例输出

复制

2

提示

【样例说明】

所有线段之间共有 3 个不同的交点:(0, 4),(43,43),(2, 2), 其中整点有 2 个:(0, 4),(2, 2)。

【评测用例规模与约定】

对于 20% 的评测用例,保证 0 ≤ uix, uiy, vix, viy ≤ 100。对于 100% 的评测用例,保证 n ≤ 500,0 ≤ uix, uiy, vix, viy ≤ 10000,保证任意蚂蚁的活动范围不会退化成一个点,不保证任意两条线段之间交点数量有限。

AC

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PI;
map<PI,int>M; 
map<PI,bool>vis;
int gcd(int a,int b){
    if(b==0) return a;
    else return gcd(b,a%b);
}
int n;
int ans = 0;
int main(){
    cin >> n;
    for(int i = 1 ; i <= n ; i ++){
        int x1,y1,x2,y2;
        cin >> x1 >> y1 >> x2 >> y2;
        int g = gcd(abs(x1-x2),abs(y1-y2));
        int ax = (x2-x1)/g;
        int ay = (y2-y1)/g;
        while(x1 != x2 || y1 != y2){
            M[PI(x1,y1)]++;
            if(M[PI(x1,y1)] >= 2 && !vis[PI(x1,y1)]){
                ans ++;
                vis[PI(x1,y1)] = 1;
            }
            x1 += ax;
            y1 += ay;
        }
        M[{x2,y2}]++;
        if(M[PI(x2,y2)] >= 2&& !vis[PI(x2,y2)]){
            ans ++;
            vis[PI(x2,y2)] = 1;
        }
    }
 
    cout << ans <<endl;
    return 0; 
}

2.蓝桥杯2024年第十五届决赛真题-立定跳远

题目描述

在运动会上,小明从数轴的原点开始向正方向立定跳远。项目设置了 n 个检查点 a1, a2, . . . , an 且 ai ≥ ai−1 > 0。小明必须先后跳跃到每个检查点上且只能跳跃到检查点上。同时,小明可以自行再增加 m 个检查点让自己跳得更轻松。

在运动会前,小明制定训练计划让自己单次跳跃的最远距离达到 L,并且学会一个爆发技能可以在运动会时使用一次,使用时可以在该次跳跃时的最远距离变为 2L。小明想知道,L 的最小值是多少可以完成这个项目?

输入格式

输入共 2 行。

第一行为两个正整数 n, m。

第二行为 n 个由空格分开的正整数 a1, a2, . . . , an。

输出格式

输出共 1 行,一个整数表示答案。

样例输入

复制

5 3
1 3 5 16 21

样例输出

复制

3

提示

【样例说明】

增加检查点 10, 13, 19,因此每次跳跃距离为 2, 2, 5, 3, 3, 3, 2,在第三次跳跃时使用技能即可。

【评测用例规模与约定】

对于 20% 的评测用例,保证 n ≤ 102,m ≤ 103,ai ≤ 103。

对于 100% 的评测用例,保证 2 ≤ n ≤ 105,m ≤ 108,0 < ai ≤ 108。

AC:

#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N];
int n, m;
bool check(int mid)

{
    int cnt = m;
    for (int i = 1; i < n; i++)
    {
        int t = a[i] - a[i - 1];
        if (mid < t)
        {
            if (t % mid == 0)
            {
                cnt -= (t / mid - 1);
                if (cnt < 0) return false;
            }
            else
            {
                cnt -= (t / mid);
                if (cnt < 0) return false;
            }
        }
    }
    return true;
}

int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i++) scanf("%d", &a[i]);
    m++;
    int l = 1, r = 1e8 + 1;
    while (l < r)
    {
        int mid = (l + r) >> 1;
        if (check(mid)) r = mid;
        else l = mid + 1;
    }
    cout << r;

    return 0;

}

3.蓝桥杯2024年第十五届决赛真题-最小字符串(中等偏下)

题目描述

给定一个长度为 N 且只包含小写字母的字符串 S,和 M 个小写字母c1, c2, . . . , cM。现在你要把 M 个小写字母全部插入到字符串 S 中,每个小写字母都可以插入到任意位置。

请问能得到的字典序最小的字符串是什么?

输入格式

第一行包含两个整数 N 和 M。

第二行包含一个长度为 N 的字符串 S。

第三行包含 M 个小写字母 c1, c2, . . . , cM。

输出格式

输出一个长度为 N + M 的字符串代表答案。

样例输入

复制

4 3
abbc
cba

样例输出

复制

aabbbcc

提示

【评测用例规模与约定】

对于 20% 的评测用例,M = 1。对于 100% 的评测用例,1 ≤ N, M ≤ 105。

AC:

#include <bits/stdc++.h>
using namespace std;
int n, m;
string s, t, ans;

int main()
{
    cin >> n >> m;
    cin >> s >> t;
    sort(t.begin(), t.end());   //将m字符串进行排序
    int j = 0;
    for (int i = 0; i < n; i++)
    {
        while (j < m && s[i] > t[j])
        {
            ans += t[j];
            j++;
        }
        ans += s[i];
    }
     
    for (int i = j; i < m; i++)
        ans += t[i];
    cout << ans << endl;

    return 0;

}

4.蓝桥杯2024年第十五届决赛真题-数位翻转(中等)

小明创造了一个函数 f(x) 用来翻转 x 的二进制的数位(无前导 0)。比如f(11) = 13,因为 11 = (1011)2,将其左右翻转后,变为 13 = (1101)2;再比如f(3) = 3,f(0) = 0,f(2) = f(4) = f(8) = 1 等等。

小明随机出了一个长度为 n 的整数数组 {a1, a2, ..., an},他想知道,在这个数组中选择最多 m 个不相交的区间,将这些区间内的数进行二进制数位翻转(将ai 变为 f(ai))后,整个数组的和最大是多少?

输入格式

输入共 2 行。

第一行为两个正整数 n, m。

第二行为 n 个由空格分开的整数 a1, a2, ..., an。

输出格式

输出共 1 行,一个整数表示答案。

样例输入

复制

5 3
11 12 13 14 15

样例输出

复制

67

提示

【样例说明 1】只翻转 a1,和为 13 + 12 + 13 + 14 + 15 = 67。

再比如:

【样例输入 2】6 223 8 11 19 16 35

【样例输出 2】134

【样例说明 2】翻转区间 [a3, a4] 和 [a6],和为 23 + 8 + 13 + 25 + 16 + 49 = 134。

【评测用例规模与约定】

对于 20% 的评测用例,保证 n, m ≤ 20。

对于 100% 的评测用例,保证 n, m ≤ 1000,0 ≤ ai ≤ 109。

AC:

#include#includeusing namespace std;
typedef long long ll;
const int maxn=1e3+100;
ll a[maxn];
ll b[maxn];
ll tmp[100000];
ll dp[maxn][maxn][2];//1是这个变化,0是不变化 
ll f(ll x){
    
    ll res = 0;
    while (x > 0) {
        res = (res << 1) | (x & 1);// 将x的最后一位加到res的最后
        x >>= 1;// 将x右移一位
    }
    return res;
}
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i>a[i];
        b[i]=f(a[i]);
    }
    for(int i=1;i<=n;i++){
        dp[i][0][0]=dp[i-1][0][0]+a[i];
        for(int j=1;j<=m;j++){
            dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j][1])+a[i];
            dp[i][j][1]=max(dp[i-1][j-1][0],dp[i-1][j][1])+b[i];
        }
    }
    ll ans=0;
    for(int j=0;j<=m;j++){
        ans=max(ans,max(dp[n][j][0],dp[n][j][1]));
    }
    cout<<ans<<endl;
}

5.蓝桥杯2022年第十三届省赛真题-统计子矩阵

题目描述

给定一个 N × M 的矩阵 A,请你统计有多少个子矩阵 (最小 1 × 1,最大 N × M) 满足子矩阵中所有数的和不超过给定的整数 K? 

输入格式

第一行包含三个整数 N, M 和 K. 

之后 N 行每行包含 M 个整数,代表矩阵 A.

输出格式

一个整数代表答案。

样例输入

复制

3 4 10
1 2 3 4
5 6 7 8
9 10 11 12

样例输出

复制

19

提示

满足条件的子矩阵一共有 19,包含:

大小为 1 × 1 的有 10 个。

大小为 1 × 2 的有 3 个。

大小为 1 × 3 的有 2 个。

大小为 1 × 4 的有 1 个。

大小为 2 × 1 的有 3 个。

对于 30% 的数据,N, M ≤ 20. 对于 70% 的数据,N, M ≤ 100. 

对于 100% 的数据,1 ≤ N, M ≤ 500; 0 ≤ Ai j ≤ 1000; 1 ≤ K ≤ 250000000.

AC:

#include<iostream>
using namespace std;
const int N  = 510 , M = 510;
int s[N][M];
long long n , m , k , cnt = 0;  //cnt要为long long,不然会报错
int main()
{
    cin>>n>>m>>k;
    for(int i = 1;i <= n;i ++)
        for(int j = 1;j <= m;j ++)
        {
            cin>>s[i][j];
            s[i][j] += s[i-1][j];   //求列的前缀和
        }
    for(int i1 = 1;i1 <= n;i1 ++)
        for(int i2 = i1;i2 <= n;i2 ++)
            for(int l = 1 , r = 1 , sum = 0;r <= m; r++)
            {//左右边界及当前子矩阵总和
                sum += s[i2][r] - s[i1 - 1][r]; //向右累加
                while(sum > k)
                {//超出k则从左边开始缩减
                    sum -= s[i2][l] - s[i1 - 1][l];
                    l++;
                }
                cnt += r - l + 1;    //以left为起始,依次扩一列作为一个子矩阵
            }
    cout<<cnt<<endl;
    return 0;
}

6. 蓝桥杯2022年第十三届省赛真题-积木画

题目描述

小明最近迷上了积木画,有这么两种类型的积木,分别为 I 型(大小为 2 个单位面积)和 L 型(大小为 3 个单位面积):

蓝桥杯2022年第十三届省赛真题积木画1

同时,小明有一块面积大小为 2 × N 的画布,画布由 2 × N 个 1 × 1 区域构成。小明需要用以上两种积木将画布拼满,他想知道总共有多少种不同的方式? 积木可以任意旋转,且画布的方向固定。

输入格式

输入一个整数 N,表示画布大小。

输出格式

输出一个整数表示答案。由于答案可能很大,所以输出其对 1000000007 取模后的值。

样例输入

复制

3

样例输出

复制

5

提示

五种情况如下图所示,颜色只是为了标识不同的积木:

蓝桥杯2022年第十三届省赛真题积木画2

对于所有测试用例,1 ≤ N ≤ 10000000.

解题思路:

思路:a[i][0]:i列积木的堆法,a[i][1]:i列多一块小方格的堆法。

如:


或者
 


不管这三块是怎么放的,都叫a[3][0].
如果在此基础上右边多一个小方格就叫a[3][1],注意小方格可以在第四列上一行也可以在第四列下一行(不好找图就不给了,自行想象)

给出动态规划方程:

a[i][0]=(a[i-2][0]+a[i-2][1]+a[i-1][0])%mod;
a[i][1]=(a[i-1][0]*2+a[i-1][1])%mod;

画布大小为i的排法,即a[i][0]的值:

  1. 先考虑少一块I型积木的排法,即a[i-1][0],这时加上一块I型积木就行了,
  2. 再考虑少一块L型积木的排法,即a[i-2][1],这时加上一块L型积木就行了,
  3. 考虑少两块I型积木的排法,即a[i-2][0],加上两块I型积木,注意,两块必需横着加进去,如果是竖着加,就相当于第一种类型排法了,重复了。
  4. 涉及缺更多积木时,会发现无论怎么排,排法都会和上述情况重复,也就是说,以上三种情况涵盖了a[i][0]的所有排法。

所以有:

a[i][0]=(a[i-2][0]+a[i-2][1]+a[i-1][0])%mod;

a[i][1]的排法,大家可以自行画图写出来。

写出初始状态:


a[1][0]=1,a[2][0]=2,a[1][1]=2,a[2][1]=4;

给出完整代码:


#include<stdio.h>
#define mod 1000000007
long int a[10000001][2];
int main()
{
int n;
a[1][0]=1,a[2][0]=2,a[1][1]=2,a[2][1]=4;
scanf("%d",&n);
if(n==1)printf("1");
else if(n==2)printf("2");
else {
for(int i=3;i<=n;i++){
a[i][0]=(a[i-2][0]+a[i-2][1]+a[i-1][0])%mod;
a[i][1]=(a[i-1][0]*2+a[i-1][1])%mod;
}
printf("%ld",a[n][0]%mod);
}

return 0;
}
 

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

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

相关文章

【银河麒麟高级服务器操作系统】修改容器中journal服务日志存储位置无效—分析及解决方案

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 服务器环境以及配置 【机型】 整机类型/架构&am…

springboot422甘肃旅游服务平台代码-(论文+源码)_kaic

摘 要 使用旧方法对甘肃旅游服务平台的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在甘肃旅游服务平台的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发的…

决策曲线分析(DCA)中平均净阈值用于评价模型算法(R自定义函数)

决策曲线分析&#xff08;DCA&#xff09;中平均净阈值用于评价模型算法 DCA分析虽然不强调用来评价模型算法或者变量组合的优劣&#xff0c;但是实际应用过程中感觉DCA曲线的走势和模型的效能具有良好的一致性&#xff0c;其实这种一致性也可以找到内在的联系&#xff0c;比如…

短信验证码burp姿势

首先声明&#xff0c;本文仅仅作为学习使用&#xff0c;因个人原因导致的后果&#xff0c;皆有个人承担&#xff0c;本人没有任何责任。 在之前的burp学习中&#xff0c;我们学习了图片验证码的突破&#xff0c;但是现实中还有很多短信验证码&#xff0c;在此我介绍几种短信验…

机器学习:全面学习路径指南

摘要&#xff1a; 本文精心规划了一条从入门到精通机器学习的学习路线&#xff0c;详细涵盖了基础理论构建、核心技术栈掌握、主流算法学习、实践项目锻炼以及前沿领域探索等多个关键阶段。通过逐步深入各个层面&#xff0c;介绍必备的数学知识、编程工具、经典与现代机器学习算…

聚类及Python下实现 K-means 算法

聚类 聚类是无监督学习中的一种重要方法&#xff0c;旨在将数据集中相似的数据对象划分到同一个簇中&#xff0c;使得不同簇之间的数据对象差异尽可能大。在大数据环境下&#xff0c;聚类可以帮助挖掘数据中的隐藏结构和模式&#xff0c;应用场景十分广泛&#xff0c;比如在客…

【Qt在线安装器】不能下载Qt5

qt在线下载不显示以前的版本时&#xff1a; 勾选”Archive“&#xff0c;点击”筛选“ 然后就会显示出QT5的版本&#xff0c; 按流程下载即可

html|本地实现浏览器m3u8播放器,告别网络视频卡顿

前言 网络上经常是以m3u8文件传输视频流的 &#xff0c;但是有时网络慢往往导致视频播放卡顿。于是我在想能不能先下载然后再播放呢&#xff1f;于是尝试下载然后实现本地播放m3u8视频。 正文 1.找到网络视频流的m3u8连接 一般在浏览器按F12就可以看到有请求视频流的连接。 …

[leetcode100] 101. 对称二叉树

https://leetcode.cn/problems/symmetric-tree/description/?envTypestudy-plan-v2&envIdtop-100-liked 心血来潮&#xff0c;突然感觉很久没做leetcode&#xff0c;刷一题。 看到“简单”&#xff0c;哦吼&#xff0c;应该很快吧。 结果真是《简单》 题目描述 给你一个…

技术速递|dotnet scaffold – .NET 的下一代内容创建

作者&#xff1a;Sayed Ibrahim Hashimi - 首席项目经理 排版&#xff1a;Alan Wang Visual Studio 中为 ASP.NET Core 项目搭建脚手架是一项长期特性&#xff0c;是在 ASP.NET Core 发布后不久添加的。多年来&#xff0c;我们一直支持从命令行搭建脚手架。根据从命令行操作中获…

经纬度解析到省市区【开源】

现在业务中有需要解析经纬度到省市区。 按理说可以直接使用高德&#xff0c;百度之类的。 但是老板太抠。于是去找开源项目。找了一圈&#xff0c;数据都太老了&#xff0c;而且有时候编码还不匹配。 所以诞生了这个项目&#xff0c;提供完整的一套省市区编码和定位反解析。…

打开分页机制

分页机制的表 一般线性地址和物理地址大小不会一样&#xff0c;物理内存空间不够时候&#xff0c;涉及和外部磁盘的swap过程&#xff0c;但是这个系统不涉及 CR3放的是页表的起始地址 代码部分 PDE:4MB page 一级页表的页块大小为4MB 然后是这个二级页表 PTE:4KB page 关于什…

EasyPlayer.js播放器如何在iOS上实现低延时直播?

随着流媒体技术的迅速发展&#xff0c;H5流媒体播放器已成为现代网络视频播放的重要工具。其中&#xff0c;EasyPlayer.js播放器作为一款功能强大的H5播放器&#xff0c;凭借其全面的协议支持、多种解码方式以及跨平台兼容性&#xff0c;赢得了广泛的关注和应用。 那么要在iOS上…

多模态大语言模型 MLLM 部署微调实践

1 MLLM 1.1 什么是 MLLM 多模态大语言模型&#xff08;MultimodalLargeLanguageModel&#xff09;是指能够处理和融合多种不同类型数据&#xff08;如文本、图像、音频、视频等&#xff09;的大型人工智能模型。这些模型通常基于深度学习技术&#xff0c;能够理解和生成多种模…

uniapp uni-table最简单固定表头

需求&#xff1a;固定表头数据&#xff0c;在网上找了半天&#xff0c;啥都有&#xff0c;就是一直实现不了&#xff0c;最后更改代码实现 1.效果 2.主要代码讲解完整代码 表格的父级一定要设置高度&#xff0c;不然会错位&#xff0c;我看网上说设置position&#xff1a;fixed…

在C#中编程绘制和移动线段

这个示例允许用户绘制和移动线段。它允许您根据鼠标下方的内容执行三种不同的操作。 当鼠标位于某个线段上时&#xff0c;光标会变成手的形状。然后您可以单击并拖动来移动该线段。当鼠标位于线段的终点上时&#xff0c;光标会变成箭头。然后您可以单击并拖动以移动终点。当鼠…

Hyperbolic Representation Learning: Revisiting and Advancing 论文阅读

Hyperbolic Representation Learning: Revisiting and Advancing 论文地址和代码地址1 介绍2 背景知识2.1 黎曼几何与双曲空间(RiemannianGeometry and Hyperbolic Space)2.2 双曲浅层模型2.3 双曲神经网络&#xff08;HNNs&#xff09;2.4 双曲图卷积神经网络&#xff08;HGCN…

Ansible自动化运维(三)playbook剧本详解

Ansible自动化运维这部分我将会分为五个部分来为大家讲解 &#xff08;一&#xff09;介绍、无密钥登录、安装部署、设置主机清单 &#xff08;二&#xff09;Ansible 中的 ad-hoc 模式 模块详解&#xff08;15&#xff09;个 &#xff08;三&#xff09;Playbook 模式详解 …

【机器学习】手写数字识别的最优解:CNN+Softmax、Sigmoid与SVM的对比实战

一、基于CNNSoftmax函数进行分类 1数据集准备 2模型设计 3模型训练 4模型评估 5结果分析 二、 基于CNNsigmoid函数进行分类 1数据集准备 2模型设计 3模型训练 4模型评估 5结果分析 三、 基于CNNSVM进行分类 1数据集准备 2模型设计 3模型训练 4模型评估 5结果分…

196-基于CPCI Express架构的6u 主控板

一、板卡概述 该板卡是基于 CPCI Express架构的3U主控板&#xff0c;CPU采用Intel Pentium M 2.0GHz CPU&#xff0c;2M L2 cache&#xff0c;533M前端总线&#xff0c;支持512MB / 1GB表贴DDRII 400/533 MHz内存。 二、功能和技术指标 Intel Pentium M 2.0GHz CPU&#xff0c…