蓝桥杯提单day2【题解】

news2024/11/26 19:56:54

题单链接

蓝桥杯题单day2【题目】_奔跑的星黛露的博客-CSDN博客

题解

蓝肽子序列

链接

https://www.lanqiao.cn/problems/1030/learning/?page=1&first_category_id=1&sort=students_count&second_category_id=3&tags=%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92,%E5%9B%BD%E8%B5%9B

思路

先将字符串预处理分割为每个大写字母开头的“蓝肽” 在将其作为判断最长子序列 判断最长子序列 可以采用 动态规划(最简单高效) if S1[i] = S2[j] dp[i][j] = dp[i][j]+1; else dp[i][j] = max(dp[i-1][j] , dp[i][j-1]) 输出最大值即可。

代码

#include<bits/stdc++.h>
using namespace std;

const int N = 1000;
int dp[N][N];
string a,b;
vector<string>tmp;
vector<string>w;

int main(){
    cin >> a >> b;
    for(int i = 0, j = 0 ; i < a.size();){
        if(a[j] >= 'A' && a[j] <= 'Z'){
            j++;
            while(a[j] >= 'a' && a[j] <= 'z' && j < a.size())j++;
            tmp.push_back(a.substr(i,j - i));
            i = j;
        }
    }
    for(int i = 0, j = 0 ; i < b.size();){
        if(b[j] >= 'A' && b[j] <= 'Z'){
            j++;
            while(b[j] >= 'a' && b[j] <= 'z' && j < b.size())j++;
            w.push_back(b.substr(i,j - i));
            i = j;
        }
    }
  
    int ans = 0;
    int n = tmp.size(),m = w.size();
    for(int i = 1; i <= n ; i++){
        for(int j = 1 ; j <= m; j++){
            if(tmp[i - 1] == w[j - 1])dp[i][j] = dp[i - 1][j - 1] + 1;
            else dp[i][j] = max(dp[i - 1][j],dp[i][j - 1]);
        }
    }

    cout << dp[n][m] << endl;
    return 0;
}

能量项链

链接

https://www.luogu.com.cn/problem/P1063

思路

考虑区间DP。

定义 fij 表示将区间 [i, j] 合并的最大能量。那么我们可以有简单的转移方程:

f[i, j] = max_{i <= k <= j} {f[i, k] + f[k, j] + w[l] * w[k] * w[r]}

上述转移方程适用于一条链的转移,但是本题我们是一个环,因此我们可以使用一个常用的技巧将环拆解成两倍长度的链,所以 答案就是 max_{1 <= i  <= n} f[i, i + n - 1]

代码

#include "bits/stdc++.h"
using namespace std;
const int N=220;
int n,g[N],f[N][N];

int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>g[i];
        g[i+n]=g[i];
    }
    for(int len=3;len<=n+1;len++){
        for(int l=1;l+len-1<=2*n;l++){
            int r=l+len-1;
            for(int k=l+1;k<r;k++){
                f[l][r]=max(f[l][r],f[l][k]+f[k][r]+g[l]*g[k]*g[r]);
            }
        }
    }
    int res=0;
    for(int l=1;l<=n;l++) res=max(res,f[l][l+n]);
    cout<<res<<endl;
    return 0;
}

字串

链接

 https://www.luogu.com.cn/problem/P2679

思路

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define CaseT int CaseT; cin >> CaseT; while(CaseT--)
#define endl '\n'
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
const int INF = 0x3f3f3f3f;

const int MOD = 1e9 + 7;

void solve() {
    int n, m, K; string a, b; cin >> n >> m >> K >> a >> b;

    vector<vector<int>> dp(m + 1, vector<int>(K + 1));
    dp[0][0] = 1;
    vector<vector<int>> pre(m + 1, vector<int>(K + 1));
    for (int i = 1; i <= n; i++) {
        for (int j = m; j; j--) {  // 从后往前匹配a[1 ... i]和b[1 ... j]
            for (int k = K; k; k--) {
                if (a[i - 1] == b[j - 1]) 
                    pre[j][k] = (pre[j - 1][k] + dp[j - 1][k - 1]) % MOD;
                else pre[j][k] = 0;

                dp[j][k] = (dp[j][k] + pre[j][k]) % MOD;
            }
        }
    }
    cout << dp[m][K] << endl;
}

int main() {
    cin.tie(0)->sync_with_stdio(false);
    // init();
    // CaseT
    solve();
    return 0;
}

对局匹配

链接

https://www.lanqiao.cn/problems/107/learning/?page=1&first_category_id=1&sort=students_count&second_category_id=3&tags=%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92,%E5%9B%BD%E8%B5%9B

思路

进行分组dp,这里是差值只要是k就不能同时选,所以会将差值为k的划分为一组,然后每一组进行动态规划就可以了

dp[i]=max(dp[i−2]+arr[i], dp[i−1])

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 100005;
int cnt[N], arr[N], dp[N];
int n, k;
 
int main() { 
    while (scanf("%d%d", &n, &k) == 2) {//输入个数n,差值k
        memset(cnt, 0, sizeof(cnt));//这里的cnt是记录每个值出现的次数
        int val, ans = 0;
        for (int i = 1; i <= n; i++) {
            scanf("%d", &val);
            cnt[val]++;
        }
        //特殊处理k=0的情况
        //处理思路是把所有的出现的元素都给ans加一
        if (k == 0) {
            for (int i = 0; i < N; i++) {
                if (cnt[i]) ans++;//计算有多少种数字
      
            }
        }
        else {
            for (int i = 0; i < k; i++) {//k个小组
                int len = 0;
                for (int j = i; j < N; j += k) {
                    arr[len++] = cnt[j];//遍历每个小组中的所有元素
                    //arr数组记录了每个元素的个数
                }
                //状态转移方程
                dp[0] = arr[0];
                for (int j = 1; j < len; j++) {
                    if (j == 1) 
                    {
                        dp[j] = max(dp[0], arr[j]);
                    }
                    else 
                    {
                        dp[j] = max(dp[j - 2] + arr[j], dp[j - 1]);
                    }
                }
                ans += dp[len - 1];//把k组的值都相加
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}

货币系统

链接

https://www.luogu.com.cn/problem/P5020

思路

若两个货币系统等价,有如下性质

 1. a1,a2,...,an一定都可以被表示出来

 2. 在最优解中,b1,b2,...bm一定都是从a1,a2,...,an中选择的

 2. b1,b2,...,bm一定不能被其他bi表示出来

步骤
由于数据中不存在负数,将 a[] 数组从小到大排序

 1. 若ai能被a0~a(i-1)表示出来,则一定不选

 2. 若ai不能被能被a0~a(i-1)表示出来,则一定选

时间复杂度 O(nm)

代码

#include "bits/stdc++.h"
using namespace std;
const int maxn=25010;
typedef long long ll;
int t,n,f[maxn],a[110];

int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        memset(f,0,sizeof f);
        f[0]=1;
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
        }
        sort(a,a+n);
        int v=a[n-1],ans=0;
        for(int i=0;i<n;i++){
            if(f[a[i]]==0)  ans++;
            for(int j=a[i];j<=v;j++){
                f[j]+=f[j-a[i]];
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

最优包含

链接

https://www.lanqiao.cn/problems/239/learning/?page=1&first_category_id=1&sort=students_count&second_category_id=3&tags=%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92,%E5%9B%BD%E8%B5%9B

思路

状态定义:f[i][j]表示第一个字符串前i个字符,第二个字符串前j个字符,第一个字符串前i个字符包含第二个字符串前j个字符的最少修改次数

初始状态:f[i][0] = 0 other f[i][j] = INF

状态转移:s1[i]==s2[j] f[i][j] = f[i - 1][j - 1]

                  s1[i] != s2[j] max(f[i - 1][j - 1] + 1, f[i - 1][j])

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1024, INF = 0x3f3f3f3f;
int f[N][N];
int main() 
{
  string s1, s2;
  cin >> s1 >> s2;
  int n = s1.size();
  int m = s2.size();
  memset(f, 0x3f, sizeof(f));
  for (int i = 0; i <= n; i++) f[i][0] = 0;
  for (int i = 1; i <= n; i++) 
  {
    for (int j = 1; j <= i && j <= m; j++) 
    {
      if (s1[i - 1] == s2[j - 1]) f[i][j] = f[i - 1][j - 1];
      else 
      {
        f[i][j] = f[i - 1][j - 1] + 1;
        if (i - 1 >= j) f[i][j] = min(f[i][j], f[i - 1][j]);
      }
    }
  }
  cout << f[n][m] << endl;
  return 0;
}

合根植物

链接https://www.lanqiao.cn/problems/110/learning/?page=1&first_category_id=1&sort=students_count&second_category_id=3&tags=%E5%B9%B6%E6%9F%A5%E9%9B%86

思路

编号为 a 的小格子和编号为 b 的小格子合根表示他们合并在了同一个集合里,把所有合并之后,若发现某一个格子的father等于格子编号,说明这是一个集合,统计一下就可以算出共有多少个合根植物。

代码

#include <bits/stdc++.h>
using namespace std;

const int N = 1e6 + 20;
int m, n, k, fa[N];

int find(int x){
  if(x == fa[x]) return x;
  return fa[x] = find(fa[x]);
}

void uni(int x, int y){
  int fx = find(x), fy = find(y);
  fa[fx] = fy;
}

int main()
{
  cin >> m >> n >> k;
  for(int i = 1; i <= m * n; i++) fa[i] = i;
  while(k--){
    int x, y;
    cin >> x >> y;
    uni(x, y);
  }
  int ans = 0;
  for(int i = 1; i <= m * n; i++){
    if(find(i) == i) ans++;
  }
  cout << ans;
  return 0;
}

Bitwise Exclusive-OR Sequence

链接

https://ac.nowcoder.com/acm/contest/24346/B?&headNav=acm

思路

种类并查集,首先可能是多个图, 对于每个图中的每一位, 取0 或者取1 都是可以确定图上的其他数字取0 或者取1 ,所以我们可以去枚举取0 或者取1 ,来取个min 得到结果。
所以这里我们用并查集, 最大数为 2的30次, 所以我们对于每一位都做一个并查集, 就是30个并查集。 f[a] 表示当前位置取1,f[a+n] 表示当前位取0,这样就可以枚举区间了。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N = 2e5+10;
ll n, m, fa[N], sz[N];
ll a[N];

struct Node
{
	ll a, b;
	ll val;
}num[N];

ll find(ll x)
{
    if(x == fa[x]) return x;
    return fa[x] = find(fa[x]);
}

void init()
{
	for(ll i = 1; i <= n; i ++)
	{
		fa[i] = i, sz[i] = 1;
		fa[i+n] = i+n, sz[i+n] = 0;
	}
}

void uni(ll a, ll b)
{
	sz[a] += sz[b];
	fa[b] = a;
}

int main()
{
	cin >> n >> m;
	for(int i = 1; i <= m; i ++)
	{
		scanf("%lld%lld%lld", &num[i].a, &num[i].b, &num[i].val);
	}
	
	ll res = 0;
	for(int i = 0; i < 30; i ++)
	{
		init(); // 每一次做并查集都要初始化!
		for(int j = 1; j <= m; j ++)
		{
			int a1 = find(num[j].a);
			int b1 = find(num[j].b);
			
			int a2 = find(num[j].a + n);
			int b2 = find(num[j].b + n);
			
			if((num[j].val >> i) & 1 ) // 不同为1 ,一个取0一个取1
			{
				if(a1 == b1)
				{
					cout << -1 << endl;
					return 0;
				}
				if(a1 == b2) continue;
				
				uni(a1, b2);
				uni(b1, a2);
			}
			else // 相同为0, 都取1 或者都取0
			{
				if(a1 == b2)
				{
					cout << -1 << endl;
					return 0;
				}
				if(a1 == b1) continue;
				
				uni(b1, a1);
				uni(b2, a2);
			}
		}
		for(int j = 1; j <= n; j ++) // 对于每个数字计算结果
		{
			res += (ll)min(sz[find(j)], sz[find(j+n)]) * (1 << i);
			sz[find(j)] = 0;
			sz[find(j+n)] = 0;
		}
	}
	
	cout << res << endl;
	return 0;
}

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

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

相关文章

VRRP高级特性——管理VRRP

目录 管理VRRP备份组与业务VRRP备份组 管理VRRP备份组的两种实现方式 配置管理备份组 当在设备上配置了多个VRRP备份组时&#xff0c;为了减少设备间交互大量的VRRP协议报文&#xff0c;可以将其中一个VRRP备份组配置为管理VRRP备份组&#xff08;mVRRP&#xff09;&#xf…

WordPress PHP版本:2023年用于WordPress的最佳PHP版本

不同的 WordPress 版本可以与多个 PHP 版本一起使用。然而&#xff0c;WordPress社区官方为每个 WP 版本推荐了特定的 PHP 要求。选择最好的 WordPress PHP 版本对于确保网站安全且没有错误至关重要。 本文从 WordPress 的推荐、最低和最新 PHP 版本的角度讨论了 PHP 和 WordP…

SpringBoot——如何获取配置文件中的配置信息

SpringBoot——如何获取配置文件中的配置信息 简单介绍&#xff1a; 之前我们看到了我们是如何对SpringBoot以及SpringBoot中不同技术进行配置的&#xff0c;我们舍弃了之前在Spring中的对不同的技术使用不同的配置信息的方式&#xff0c;使用将所有技术的配置写在了一个配置…

Mac(苹果)安装nvm进行node版本控制

Mac&#xff08;苹果&#xff09;安装nvm进行node版本控制 错误演示nvm安装下载命令更改网络环境配置环境 相信我一般的初学者问题看这一片就够了 错误演示 如上图所示&#xff0c;node的版本&#xff0c;与当前项目中的一些框架或者组件不支持时一般就会报这个错&#xff0c;…

一天吃透SpringCloud面试八股文

1、什么是Spring Cloud &#xff1f; Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序&#xff0c;提供与外部系统的集成。Spring cloud Task&#xff0c;一个生命周期短暂的微服务框架&#xff0c;用于快速构建执行有限数据处理的应用程序。 Sprin…

Portraiture4.1.0最新版PS/LR磨皮美白滤镜插件

Portraiture这款插件磨皮效率超高 是99%摄影师的必备插件 一秒磨皮&#xff0c;无卡顿&#xff0c;效果好 最新版Portraiture 2023磨皮效果提升很大 之前发布了Portraitrue4.0.3版 现已更新!本期带来最新版&#xff1a; 磨皮插件Portraiture 4.1.0版!portraiture最新版本…

LITCTF2023 部分WP

WEB 我Flag呢&#xff1f; 查看源码就有flag了 彩蛋 导弹迷踪 Follow me and hack me 然后彩蛋www.zip解压即可 PHP是世界上最好的语言&#xff01;&#xff01; 直接可以命令执行,当时想了好久 Vim yyds 扫目录,有swp文件 作业管理系统 任意文件上传,传个马访问就…

十二、目标检测

文章目录 1、 目标定位2、特征点检测3、卷积网络的滑动窗口4、交并比(Intersection over Union)5、非最大值抑制(Non Max Suppression)6、anchor boxTHE END 1、 目标定位 \qquad 目标检测是图像识别中的更加复杂的应用情景&#xff0c;图像识别只需要输出某一幅图像的种类即可…

React面试题汇总1

1.React的严格模式如何使用&#xff0c;有什么用处&#xff1f; React中StrictMode严格模式_react.strictmode_前端精髓的博客-CSDN博客当我们使用 npx create-react-app my-app 创建一个项目的时候。项目中有一段如下所示的代码&#xff1a;ReactDOM.render( <React.Stric…

LeetCode_Day2 | 有意思的数组滑动窗口及螺旋矩阵

LeetCode_数组 977.有序数组的平方1.题目描述2.暴力法3. 双指针法 209.长度最小的子数组1.题目描述2.暴力法3.滑动窗口(双指针法) 59.螺旋矩阵1.题目描述2. 螺旋矩阵解法 977.有序数组的平方 1.题目描述 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字…

解决IDEA中集成Tomcat日志出现的乱码问题

解决IDEA中集成Tomcat日志出现的乱码问题 下面的方式可以解决的是解决的是idea中出现的控制台&#xff0c;Localhost日志以及Catalina日志乱码的问题 1.出现的乱码问题 你是不是也是遇到了这种的乱码的情况呢&#xff1f; 2.解决方法 1.打开conf文件夹。 2.设置输出的日志的编…

【小沐学Python】Python实现在线英语翻译功能

文章目录 1、简介2、在线翻译接口2.1 Google Translate API2.2 Microsoft Translator API2.2.1 开发简介2.2.2 开发费用2.2.3 开发API 2.3 百度翻译开放平台 API2.3.1 开发简介2.3.2 开发费用2.3.3 开发API 2.4 Tencent AI 开放平台的翻译 API2.4.1 开发简介2.4.2 开发API 2.5 …

人工智能基础部分16-神经网络与GPU加速训练

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能基础部分15-神经网络与GPU加速训练&#xff0c;在深度学习领域&#xff0c;神经网络已经成为了一种流行的、表现优秀的技术。然而&#xff0c;随着神经网络的规模越来越大&#xff0c;训练神经网络所需的时…

Kafka Connect JNDI注入漏洞复现(CVE-2023-25194)

漏洞原理 Apache Kafka Connect中存在JNDI注入漏洞&#xff0c;当攻击者可访问Kafka Connect Worker&#xff0c;且可以创建或修改连接器时&#xff0c;通过设置sasl.jaas.config属性为com.sun.security.auth.module.JndiLoginModule&#xff0c;进而可导致JNDI注入&#xff0c…

数字设计小思 - 谈谈非理想时钟的时钟偏差

写在前面 本系列整理数字系统设计的相关知识体系架构&#xff0c;为了方便后续自己查阅与求职准备。在FPGA和ASIC设计中&#xff0c;时钟信号的好坏很大程度上影响了整个系统的稳定性&#xff0c;本文主要介绍了数字设计中的非理想时钟的偏差来源与影响。 &#xff08;本文长…

数据结构-排序-(直接插入、折半插入、希尔排序、冒泡、快速排序)

目录 一、直接插入排序 二、折半插入排序 三、希尔排序 四、冒泡排序 五、快速排序 *效率分析 一、直接插入排序 思想&#xff1a;每次将一个待排序的记录按其关键字大小插入到前面已经排好序中&#xff0c;直到全部记录插入完毕 保证稳定性 空间复杂度&#xff1a;O(1…

SpringBoot 基本介绍--依赖管理和自动配置--容器功能

目录 SpringBoot 基本介绍 官方文档 Spring Boot 是什么? SpringBoot 快速入门 需求/图解说明 完成步骤 创建MainApp.java SpringBoot 应用主程序 创建HelloController.java 控制器 运行MainApp.java 完成测试 快速入门小结 Spring SpringMVC SpringBoot 的关系 梳…

【论文阅读】RapSheet:端点检测和响应系统的战术来源分析(SP-2020)

Tactical Provenance Analysis for Endpoint Detection and Response Systems S&P-2022 伊利诺伊大学香槟分校 Hassan W U, Bates A, Marino D. Tactical provenance analysis for endpoint detection and response systems[C]//2020 IEEE Symposium on Security and Priva…

【YOLO系列】--YOLOv5网络结构超详细解读/总结

前言 官方源码仓库&#xff1a;GitHub - ultralytics/yolov5: YOLOv5 &#x1f680; in PyTorch > ONNX > CoreML > TFLite YOLOv5至今没有论文发表出来&#xff0c;YOLOv5项目的作者是Glenn Jocher并不是原作者Joseph Redmon。作者当时也有说准备在2021年的12月1号之…

linux pl320 mbox控制器驱动分析 - (1) pl320手册分析

linux pl320 mbox控制器驱动分析 1 pl320简介1.1 pl320用途1.2 pl320 IPCM 由以下部分组成&#xff1a;1.3 pl320 IPCM可配置的参数1.4 功能操作1.5 IPCM 操作流程1.6 Channel ID 2 Using mailboxes&#xff08;使用邮箱中断&#xff09;2.1 Defining source core2.2 Defining …