lqb_算法(2)

1.蓝桥杯2024年第十五届省赛真题-遗迹

题目描述

小蓝找到了一个外星文明留下来的遗迹,遗迹大门的屏幕上有一个长度为m 的字符串 t 和一个输入框,下面还有一个键盘,键盘为一个长度为 n 的字符串 s ,由一个可以横向移动的指针来敲击键盘,指针可以向左移或向右移,不能移出键盘。

小蓝需要在键盘字符串 s 上先指定指针初始位置然后不断移动指针的位置,过程中通过敲击指针所在的字符来进行输入。然而,指针最多只能移动 L 的距离,小蓝想输入一个尽可能长的一个 t 的前缀,请问他最多能输入多少位。

输入格式

输入的第一行包含三个正整数 n, m, L ,相邻整数之间使用一个空格分隔。

第二行包含一个长度为 n 的字符串 s 。

第三行包含一个长度为 m 的字符串 t 。

输出格式

输出一行包含一个整数表示答案。

样例输入

复制

复制代码
3 6 5
abc
acbbac

样例输出

复制

复制代码
5

提示

【样例说明】

初始选择指针位于键盘 abc 上的 a ,输入 acbbac 这 6 个字符分别需要指针移动 0, 2, 1, 0, 1, 2 的距离,而最大移动距离为 5 ,所以最多输入 5 个字符,移动 0 + 2 + 1 + 0 + 1 = 4 的距离。

【评测用例规模与约定】

对于 20% 的评测用例,1 ≤ m ≤ 20;

对于所有评测用例,1 ≤ n ≤ 103 ,1 ≤ m ≤ 105 ,1 ≤ L ≤ 109 且 s, t 中只包含小写字母,且 s 中一定包含所有 t 中出现过的字母,数据保证随机。

AC:

cpp 复制代码
#include<bits/stdc++.h>

using namespace std;

const int N = 1005;

struct w{ int x,y,z;};

vector<w> pre[26];

int main(){

        int i,j,x,y,n,m,L,u=1,k,fl,c[N],ret;

        string s,t;

        cin>>n>>m>>L>>s>>t;

        for(i=0;i<n;i++)

            pre[s[i]-'a'].push_back(w{1,i,0});

        for(i=1;i<m;i++){

             x=t[i-1]-'a',y=t[i]-'a'; ret=INT_MAX;

             if(x==y)

                for(auto& k1 : pre[y]){

                    if(k1.x==u) k1.x=u+1;

                }

             else{

                 fl=0;

                 for(auto& k1 : pre[y]){

                     for(auto& k2 : pre[x])

                          if(k2.x==u){

                             int d=k2.z+abs(k1.y-k2.y);

                             ret=min(ret,d);

                         }

                     if(ret<=L) fl=1,k1.x=u+1,k1.z=ret;

                }

                if(!fl){ cout<<u; return 0;} 

             }

             ++u;

      }

     cout<<u; return 0;

}

2.蓝桥杯2024年第十五届省赛真题-最强小队

题目描述

在蓝桥王国,一支勇士队伍依照既定的顺序排列。队伍由 n 位勇士组成,每位勇士都有一个力量值,分别为 a1, a2, . . . , an。

国王下达了一项命令,要求从这支队伍中选拔一支精英小队,这支小队需满足以下条件:

  1. 小队成员必须按照原队伍的次序来组成,即小队成员的排列顺序必须与原队伍保持一致。

  2. 小队的首位和末位勇士的力量必须大于小队中其他所有勇士的力量。

对于一个小队,其强度与成员数量成正比,即成员数量越多,小队越强大。

现在,国王想要知道,最强小队的成员数量是多少。请你帮他找到并计算出最强小队的成员数量。

输入格式

输入的第一行包含一个整数 n,表示勇士的数量。

第二行包含 n 个整数 a1, a2, . . . , an ,相邻整数之间使用一个空格分隔,表示每位勇士的力量值。

输出格式

输出一行包含一个整数,表示最强小队的成员数量。

样例输入

复制

复制代码
3
3 1 2

样例输出

复制

复制代码
3

提示

【样例说明】

在给定的样例中,勇士队伍的力量值为 [3, 1, 2],我们可以选择的精英小队组建方法有:

  1. 只选择第一位勇士,即 [3]。

  2. 只选择第二位勇士,即 [1]。

  3. 只选择第三位勇士,即 [2]。

  4. 选择第一位勇士和第二位勇士,即 [3, 1]。

  5. 选择第一位勇士和第三位勇士,即 [3, 2]。

  6. 选择第二位勇士和第三位勇士,即 [1, 2]。

  7. 选择所有勇士,即 [3, 1, 2]。

显然,选择所有勇士 [3, 1, 2] 组成的小队是最强的。因此,最强小队的成员数量为 3。

【评测用例规模与约定】

对于 10% 的评测用例,1 ≤ n ≤ 102,1 ≤ ai ≤ 103。

对于 30% 的评测用例,1 ≤ n ≤ 103,1 ≤ ai ≤ 105。

对于所有评测用例,1 ≤ n ≤ 105,1 ≤ ai ≤ 109。

AC:

cpp 复制代码
#include<bits/stdc++.h>

using namespace std;

const int N = 1e5+5;

int main(){

    int i,j=0,n,a[N],t=1,k;

    cin>>n;

    for(i=0;i<n;i++) cin>>a[i];

    while(j<n-1){

        k=j+1;

        while(a[k]<a[j]&&k<n) k++;

        if(k==n) --k;

        t=max(t,k-j+1); j=k;

    }

    cout<<t;

    return 0;

}
相关推荐
OTWOL17 分钟前
【C++编程入门基础(一)】
c++·算法
谏君之23 分钟前
C语言实现的常见算法示例
c语言·算法·排序算法
机器视觉知识推荐、就业指导1 小时前
【数字图像处理二】图像增强与空域处理
图像处理·人工智能·经验分享·算法·计算机视觉
IT猿手2 小时前
超多目标优化:基于导航变量的多目标粒子群优化算法(NMOPSO)的无人机三维路径规划,MATLAB代码
人工智能·算法·机器学习·matlab·无人机
Erik_LinX2 小时前
算法日记25:01背包(DFS->记忆化搜索->倒叙DP->顺序DP->空间优化)
算法·深度优先
Alidme2 小时前
cs106x-lecture14(Autumn 2017)-SPL实现
c++·学习·算法·codestepbystep·cs106x
小王努力学编程2 小时前
【算法与数据结构】单调队列
数据结构·c++·学习·算法·leetcode
最遥远的瞬间2 小时前
15-贪心算法
算法·贪心算法
万兴丶3 小时前
Unity 适用于单机游戏的红点系统(前缀树 | 数据结构 | 设计模式 | 算法 | 含源码)
数据结构·unity·设计模式·c#
维齐洛波奇特利(male)3 小时前
(动态规划 完全背包 **)leetcode279完全平方数
算法·动态规划